만드는 중입니다

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

접두사 없는 질의

시간 제한2초메모리 제한256 MB

요약
문자열의 부분 문자열 목록이 주어지면, 각 질의마다 접두사가 없는 부분집합의 개수를 m으로 나눈 나머지로 구합니다.
난이도

어려움10점 중 9점

유형
문자열, 트라이, 동적 계획법, 분할 정복
정답자
아직 제출이 없습니다

문제

C(s1,s2,…,sk)C (s_1, s_2, \ldots, s_k)는 다중집합 {s1,s2,…,sk}\{s_1, s_2, \ldots, s_k\}에서 접두사 없는 집합을 만드는 방법의 수이다. 접두사 없는 집합은 서로 다른 문자열들의 집합이며, 어떤 문자열도 다른 문자열의 접두사가 아니어야 한다. 빈 집합도 유효한 접두사 없는 집합이다. 예를 들어 i≠ji \neq j인 모든 i,ji, j에 대해 sis_i가 sjs_j의 접두사가 아니라면 C(s1,…,sk)=2kC (s_1, \ldots, s_k) = 2^{k}이다.

여기서 세는 것은 집합 자체가 아니라 만드는 방법이다. 즉, {1,2,…,k}\{1, 2, \ldots, k\}의 добав 인덱스 부분집합 중 해당 인덱스의 문자열들이 접두사 없는 집합을 이루는 경우의 수를 센다. 예를 들어 CC("aa", "aa", "a", "a") =5= 5이다. 다섯 가지 방법은 빈 집합, 첫 번째 문자열만 담은 집합, 두 번째 문자열만 담은 집합, 세 번째 문자열만 담은 집합, 네 번째 문자열만 담은 집합이다.

길이가 nn인 영소문자 문자열 ss와 qq개의 질의가 주어진다. s[l,r]s[l, r]을 부분 문자열 slsl+1…srs_{l} s_{l + 1} \ldots s_{r}이라 하자. 각 질의 "kk mm l1l_1 r1r_1 l2l_2 r2r_2 …\ldots lkl_k rkr_k"에 대해 C(s[l1,r1],s[l2,r2],…,s[lk,rk])C (s[l_1, r_1], s[l_2, r_2], \ldots, s[l_k, r_k])를 mm으로 나눈 나머지를 출력하라.

입력

첫 번째 줄에 두 정수 nn과 qq가 주어진다 (1≤n≤4⋅1051 \le n \le 4 \cdot 10^{5}, 1≤q≤4⋅1051 \le q \le 4 \cdot 10^{5}). 두 번째 줄에는 길이 nn의 문자열 ss가 주어진다. 이어지는 qq개의 줄에 각각 "kk mm l1l_1 r1r_1 …\ldots lkl_k rkr_k" 형식의 질의가 하나씩 주어진다. 여기서 1≤k≤4⋅1051 \le k \le 4 \cdot 10^{5}, 2≤m≤1092 \le m \le 10^{9}, 1≤lj≤rj≤n1 \le l_j \le r_j \le n이다. 모든 질의의 kk를 합하면 4⋅1054 \cdot 10^{5}를 넘지 않는다.

출력

각 질의에 대해 C(s[l1,r1],…,s[lk,rk])C (s[l_1, r_1], \ldots, s[l_k, r_k])를 mm으로 나눈 나머지를 한 줄에 출력한다.

예제1

  1. 예제 1

    입력
    10 6
    aabbaacaba
    4 30 1 2 5 6 10 10 10 10
    5 20 1 2 3 4 5 6 7 8 9 10
    1 2 1 10
    3 20 9 9 7 7 8 8
    5 20 6 6 7 7 8 8 9 9 10 10
    4 20 1 1 2 2 3 3 4 4
    
    예상 출력
    5
    4
    0
    8
    16
    9