만드는 중입니다

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

워넘 줄

시간 제한1초메모리 제한2048 MB

요약
길이가 1에서 6인 벌레들이 큐에서 합쳐지고 나뉠 때, 문자열 s의 길이 k인 부분 문자열마다 f(t)를 구해 곱한 값을 계산합니다.
난이도

어려움10점 중 9점

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

문제

워넘 nn마리가 1번부터 nn번까지 번호가 붙어 있다. 각 워넘의 길이는 1 이상 6 이하의 정수이다. 워넘들을 여러 개의 줄(queue)로 배치하려 한다. 처음에는 각 워넘이 자기 혼자만 있는 줄에 서 있다. 각 워넘은 자기 줄의 맨 앞이자 맨 뒤이다.

연산은 mm개 주어진다. 연산은 다음 세 가지 중 하나이다.

  • 1 i j (1≤i,j≤n1 \leq i,j \leq n): 워넘 ii가 속한 줄과 워넘 jj가 속한 줄을 합친다. 합쳐진 줄에서 워넘 jj는 워넘 ii 바로 뒤에 온다. 나머지 워넘의 앞뒤 관계는 그대로 유지된다. 워넘 ii는 어떤 줄의 맨 뒤에 있고, 워넘 jj는 어떤 줄의 맨 앞에 있으며, ii와 jj는 같은 줄에 있지 않다는 것이 보장된다.
  • 2 i (1≤i≤n1 \leq i \leq n): 워넘 ii와 바로 뒤의 워넘 사이에서 줄을 나눈다. 워넘 ii는 줄의 맨 뒤가 아니라는 것이 보장된다.
  • 3 s k (kk는 양의 정수이고, ss는 길이가 kk 이상인 숫자 문자열): 길이가 kk인 ss의 모든 부분 문자열 tt에 대해 f(t)f(t)를 전부 곱한 값을 998 244 353998\,244\,353으로 나눈 나머지를 구한다. ss와 kk가 주어지면 이런 부분 문자열은 ∣s∣−k+1|s|-k+1개이다.

f(t)f(t)는 다음과 같이 정의한다.

주어진 줄에서 워넘 ii 뒤의 kk-문자열은 ii에서 시작해 줄의 뒤쪽으로 가면서 ii를 포함해 ii에 가장 가까운 워넘 kk마리를 찾고, 이 워넘들의 길이를 순서대로 이어 붙인 것이다. 줄 끝에 도달하기 전에 워넘이 kk마리보다 적게 남으면 워넘 ii는 kk-문자열을 갖지 않는다. 예를 들어 줄에 워넘 10, 22, 3이 이 순서로 있고 길이가 각각 4, 5, 6이라고 하자. 워넘 10 뒤의 3-문자열은 456이다. 워넘 22에는 3-문자열이 없지만, 2-문자열은 56이고 1-문자열은 5이다.

f(t)f(t)는 kk-문자열이 정확히 tt인 워넘의 수이다.

입력

첫 줄에 워넘의 수 nn과 연산의 수 mm이 주어진다. 둘째 줄에는 워넘 1번부터 nn번까지의 길이가 nn개의 양의 정수로 주어지며, 각 값은 6 이하이다. 이어서 mm개의 줄에 연산이 한 줄씩 주어진다. 입력 파일이 클 수 있다.

출력

3 s k 연산마다 답을 한 줄에 하나씩 출력한다.

제한

n≤2×105n \leq 2 \times 10^5, m≤5×105m \leq 5 \times 10^5, k≤50k \leq 50.

모든 쿼리에서 ss 길이의 합을 ∑∣s∣\sum |s|라고 한다. 이때 ∑∣s∣≤107\sum |s| \leq 10^7이다.

2 i 형태의 연산 개수를 cc라고 한다. 이때 c≤103c \leq 10^3이다.

예제2

  1. 예제 1

    입력
    5 9
    3 1 3 5 3
    3 333135 2
    3 333135 1
    1 1 3
    1 2 5
    1 3 2
    1 5 4
    3 333135 2
    3 333135 1
    3 333135 3
    
    예상 출력
    0
    81
    1
    81
    0
    
  2. 예제 2

    입력
    2 10
    6 6
    3 666666 1
    1 1 2
    3 666666 2
    3 666666 4
    3 666666666666666666666666666666 1
    2 1
    1 2 1
    3 666666 2
    3 666666 4
    3 666666666666666666666666666666 1
    
    예상 출력
    64
    1
    0
    75497471
    1
    0
    75497471