만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

아이디어 찾기

시간 제한5초메모리 제한1024 MB

요약
글자를 덧붙이거나 앞서 만든 부분을 다시 복사하는 블록들로 만들어진 최종 문자열에서 p가 나타나는 횟수를 셉니다.
난이도

어려움10점 중 8점

유형
문자열 매칭, 문자열, 구현
정답자
아직 제출이 없습니다

문제

3019년 고대 도시 이노폴리스에서 고고학자들이 하드 디스크를 발견했다. 이 디스크에는 전 러시아 정보올림피아드 문제 본문이 모두 들어 있을 것으로 추정되는 파일이 있다.

파일을 조사해 보니, 내용은 영문 소문자로 이루어진 문자열 tt로 부호화되어 있었다. 문제 본문은 꽤 길고 반복이 많아서, 파일은 압축된 상태로 디스크에 저장되어 있었다. 압축을 풀 때는 다음 알고리즘을 쓴다.

압축 해제 과정에서 영문 소문자로 이루어진 문자열 tt가 만들어진다. 처음에는 빈 문자열이다. 압축 파일은 nn개의 블록으로 이루어져 있고, 순서대로 처리해야 한다. 각 블록은 두 가지 종류 중 하나이다.

  • 블록 1 $w$: 여기서 ww는 문자열이다. 이 블록을 처리하면 ww를 tt의 끝에 붙인다.
  • 블록 2 $pos$ $len$: 여기서 pospos와 lenlen은 양의 정수이다. tt의 문자는 1번부터 번호를 매긴다. 이 블록을 처리하면 tt의 pospos번째 문자부터 연속한 lenlen개의 문자를 하나씩 차례로 tt의 끝에 붙인다. lenlen이 충분히 크면, 방금 붙인 문자가 같은 블록을 처리하는 동안 다시 사용될 수 있다.

연구진은 어떤 아이디어가 올림피아드에서 몇 번 등장했는지 알고 싶다. 영문 소문자로 이루어진 문자열 pp를 만들고, 압축을 푼 문자열 tt에 pp가 부분 문자열로 몇 번 나오는지 센다.

길이 mm인 문자열 pp가 ii번째 문자에서 시작해 tt에 나온다는 것은, tt의 ii번째 문자부터 연속한 mm개의 문자가 pp를 이룬다는 뜻이다. 예를 들어 aba는 ababaaba에 세 번 나온다. 위치는 1, 3, 6이다.

압축을 푼 문자열 tt에서 pp가 나오는 횟수를 세는 프로그램을 작성하라.

입력

첫 줄에 자연수 mm과 nn이 주어진다. mm은 문자열 pp의 길이이고, nn은 압축 텍스트의 블록 수이다 (1≤m≤2⋅1051 \le m \le 2 \cdot 10^5, 1≤n≤1041 \le n \le 10^4).

둘째 줄에는 비어 있지 않은 문자열 pp가 주어진다. pp는 영문 소문자로만 이루어진다.

다음 nn개의 줄에는 위 형식의 블록이 한 줄에 하나씩 주어진다. 첫 번째 종류 블록의 문자열 ww는 비어 있지 않고, 첫 번째 종류 블록에 있는 모든 ww의 길이 합은 2⋅1052 \cdot 10^5을 넘지 않는다. 두 번째 종류 블록을 처리할 때, tt에는 이미 pospos개 이상의 문자가 있다. 압축을 푼 텍스트의 길이는 101510^{15}을 넘지 않는다.

출력

문자열 pp가 텍스트에 나타나는 횟수를 나타내는 정수 하나를 출력한다.

힌트

예시 파일을 풀면 다음 문자열이 차례로 나온다. 빈 문자열 →\to ab →\to ababa →\to ababaaba →\to ababaabaababaaba.

문자열 aba는 ababaabaababaaba에 6번 나온다.

예제1

  1. 예제 1

    입력
    3 4
    aba
    1 ab
    2 1 3
    2 3 3
    2 1 8
    
    예상 출력
    6