만드는 중입니다

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

좋아하는 음악

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

요약
n개의 음 문자열과 q개의 쌍이 주어질 때, 두 조각을 연속 부분 문자열로 포함하는 가장 짧은 문자열의 길이를 구한다.
난이도

어려움10점 중 8점

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

문제

알은 음악을 아주 좋아한다. 그중에서도 특히 즐겨 듣는 음악 조각이 nn개 있다.

음악은 음표로 적을 수 있다. 여기서는 쉼표와 음표의 길이, 옥타브를 모두 무시한다. 화음도 없어서 두 음이 동시에 울리는 일은 없다. 그래서 음악 조각은 아래 12개 음 이름을 늘어놓은, 비어 있지 않은 수열이다.

C, C#, D, D#, E, F, F#, G, G#, A, A#, B

조각은 음 이름을 공백 없이 이어 붙여 적는다. 샤프가 붙은 음은 알파벳 뒤에 #을 붙여 적고, 이 두 글자가 하나의 음이다. 예를 들어 A#A는 A#과 A, 두 음으로 이루어진 조각이고, AA#은 A와 A#으로 이루어진 조각이다.

좋아하는 음악을 듣는 것보다 좋은 일은 좋아하는 음악을 더 많이 듣는 것뿐이다. 그런데 알에게는 시간이 넉넉하지 않다. 그래서 조각 두 개를 한 번에 듣는 데 걸리는 시간의 최솟값이 궁금하다. 두 조각은 서로 겹쳐도 되지만, 각 조각의 음은 원래 순서 그대로, 중간에 다른 음이 끼어들지 않게 연속으로 울려야 한다.

질문마다 조각 두 개의 번호가 주어진다. 두 조각을 모두 이 조건대로 담고 있는 음 수열 중 가장 짧은 것의 길이를 구하면 된다. 음 하나를 듣는 데 걸리는 시간은 1이다.

입력

첫째 줄에 음악 조각의 개수 nn (1≤n≤3×1051 \le n \le 3 \times 10^5)이 주어진다.

다음 nn개 줄에 조각이 한 줄에 하나씩, 음 이름을 공백 없이 이어 붙인 형태로 주어진다. 모든 조각은 서로 다르다. 조각을 적은 문자열의 길이를 모두 더한 값은 3×1053 \times 10^5 이하이다.

그다음 줄에 질문의 개수 qq (1≤q≤1051 \le q \le 10^5)가 주어진다.

다음 qq개 줄에 서로 다른 조각 번호 두 개가 주어진다. 조각의 번호는 입력에 나온 순서대로 11번부터 nn번까지이다.

출력

질문마다 두 조각을 모두 듣는 데 필요한 시간의 최솟값을 한 줄에 하나씩 출력한다.

예제2

  1. 예제 1

    입력
    3
    ABCAB
    AC
    ACAB
    3
    1 2
    1 3
    2 3
    
    예상 출력
    7
    7
    4
    
  2. 예제 2

    입력
    5
    EBEBGF#DEEBEBF#GABBEBECBGAAADAEADA
    EECAGGECDECBAACDEECAAAFABCAGAAAA
    EECAGGECDECBAACDECEFGCGFEFDCDDDD
    G#A#CDD#FD#DCA#G#A#CDD#FDD#FGG#A#G#GFD#DD#FGG#A#
    GG#A#CDD#DCFD#DGFD#DCA#CDD#FGFD#A#CA#G#GFD#DCC
    3
    2 3
    4 5
    5 1
    
    예상 출력
    64
    63
    66