만드는 중입니다

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

부분 문자열 문제

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

요약
텍스트 t와 서로 다른 문자열 집합이 주어질 때, 각 질의 구간 t[l..r] 안에 집합의 문자열이 완전히 포함된 횟수를 셉니다.
난이도

어려움10점 중 8점

유형
문자열 매칭, 트라이, 누적 합
정답자
아직 제출이 없습니다

문제

필립은 문자열 문제를 아주 좋아한다. 그는 이미 알고 있던 문제를 모두 풀었지만 그것으로는 부족해서 직접 문제를 만들기로 했다.

그는 문자열 tt와 nn개의 문자열 s1s_1, s2s_2, s3s_3, …\ldots, sns_n으로 이루어진 집합을 골랐다. 필립에게는 mm개의 쿼리가 있다. ii번째 쿼리에서 필립은 tt의 lil_i번째 문자부터 rir_i번째 문자까지의 부분 문자열을 잡고, 그 안에서 집합의 어떤 문자열과 일치하는 부분 문자열의 개수를 세고 싶어 한다. 정확히는 li≤a≤b≤ril_i \le a \le b \le r_i를 만족하고, tt의 aa번째 문자부터 bb번째 문자까지의 부분 문자열이 집합의 어떤 sjs_j와 같은 위치 쌍 (a,b)(a, b)의 개수를 구하는 것이다.

tt의 aa번째 문자부터 bb번째 문자까지의 부분 문자열은 tt의 앞에서 a−1a-1개 문자와 뒤에서 ∣t∣−b|t|-b개 문자를 지워서 얻은 문자열이다. 여기서 ∣t∣|t|는 tt의 길이다.

필립은 이 문제를 이미 풀었다. 당신은 풀 수 있는가?

입력

첫 줄에 양의 정수 nn과 mm이 주어진다 (1≤n,m≤500 0001 \le n, m \le 500\,000). 각각 집합에 포함된 문자열의 개수와 쿼리의 개수이다.

둘째 줄에는 소문자 영어 알파벳으로 이루어진 문자열 tt가 주어진다 (1≤∣t∣≤5⋅1061 \le |t| \le 5 \cdot 10^6).

다음 nn개 줄에는 각각 하나의 문자열 sis_i가 주어진다. 각 sis_i는 소문자 영어 알파벳으로만 이루어져 있다. 집합에 있는 모든 문자열 길이의 합을 SS라고 하면 S≤106S \le 10^6이다. 또한 모든 sis_i는 서로 다르다.

다음 mm개 줄에는 쿼리가 주어진다. ii번째 쿼리는 양의 정수 lil_i, rir_i로 이루어지며 (1≤li≤ri≤∣t∣1 \le l_i \le r_i \le |t|), tt에서 잘라낼 부분 문자열의 왼쪽 경계와 오른쪽 경계를 뜻한다.

출력

한 줄에 mm개의 정수를 출력한다. ii번째 정수는 ii번째 쿼리의 답이다.

힌트

첫 번째 예제의 첫 번째 쿼리에서는 전체 문자열 안에서 집합에 속하는 부분 문자열을 센다. aba는 [1,3][1, 3], [4,6][4, 6]과 일치한다. a는 [1,1][1, 1], [3,3][3, 3], [5,5][5, 5], [7,7][7, 7]과 일치한다. ac는 [3,4][3, 4]와만 일치한다. 따라서 abacaba에서 집합의 문자열과 일치하는 부분 문자열은 모두 7개이다.

두 번째 쿼리에서 1번째부터 3번째 문자까지의 부분 문자열은 aba이다. 여기에는 aba가 1번, a가 2번 나타나고, ac는 전혀 나타나지 않는다.

세 번째 쿼리에서 2번째부터 7번째 문자까지의 부분 문자열은 bacaba이다. 여기에는 aba가 1번, a가 3번, ac가 1번 나타난다.

예제2

  1. 예제 1

    입력
    3 5
    abacaba
    aba
    a
    ac
    1 7
    1 3
    2 7
    2 5
    4 5
    
    예상 출력
    7 3 5 3 1
    
  2. 예제 2

    입력
    4 4
    abcdca
    ab
    ca
    bcd
    openolympiad
    1 5
    2 2
    2 6
    1 6
    
    예상 출력
    2 0 2 3