만드는 중입니다

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

공통 부분 문자열 쿼리

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

요약
문자열 N개가 주어지고 길이의 합은 20만 이하입니다. 각 질의마다 S_i와 S_j에 공통으로 나타나는 서로 다른 부분 문자열의 개수를 구합니다.
난이도

어려움10점 중 8점

유형
문자열 매칭, 트리, 정렬
정답자
아직 제출이 없습니다

문제

알파벳 소문자로만 이루어진 NN개의 문자열 S1,…,SNS_1, \dots, S_N이 주어진다. 다음 쿼리를 처리하는 프로그램을 작성하시오.

  • i ji\ j: SiS_i와 SjS_j의 서로 다른 공통 부분 문자열의 개수를 구한다.

문자열의 부분 문자열은 그 문자열에서 비어 있지 않은 연속한 부분이다. 두 문자열 AA와 BB의 공통 부분 문자열은 AA의 부분 문자열이면서 BB의 부분 문자열인 문자열이다.

입력

첫째 줄에 문자열의 개수 NN이 주어진다(1≤N≤200 0001 \leq N \leq 200\,000). 이어지는 NN개의 줄에 알파벳 소문자로 이루어진 문자열 S1,…,SNS_1, \dots, S_N이 한 줄에 하나씩 주어진다. S1,…,SNS_1, \dots, S_N의 길이의 합은 200 000200\,000을 넘지 않는다.

이어지는 줄에 쿼리의 개수 QQ가 주어진다(1≤Q≤200 0001 \leq Q \leq 200\,000). 이어지는 QQ개의 줄에는 쿼리를 나타내는 두 정수 ii와 jj가 주어진다(1≤i,j≤N1 \leq i, j \leq N).

출력

각 쿼리의 답을 입력 순서대로 한 줄에 하나씩 출력한다.

예제2

  1. 예제 1

    입력
    5
    melon
    lemon
    apple
    grape
    peach
    5
    1 2
    4 5
    2 4
    3 4
    3 3
    
    예상 출력
    6
    4
    1
    4
    14
    
  2. 예제 2

    입력
    4
    sunrin
    high
    school
    olympiad
    5
    1 3
    2 2
    2 4
    3 2
    4 1
    
    예상 출력
    1
    9
    1
    1
    1