A-to-Z
시간 제한1초메모리 제한128 MB
단어 사전이 주어질 때, 각 글자 쌍마다 연속한 단어가 두 글자 이상 겹치고 첫 단어는 C1로 시작하며 마지막 단어는 C2로 끝나는 단어 사슬의 최소 전체 너비를 구한다.
문제
A-to-Z는 초등학생들이 철자 실력을 기르고 어휘를 늘리기 위해 즐겨 하는 놀이다. 놀이에는 여러 개의 단어가 주어지며, 각 단어는 플라스틱 조각에 하나씩 적혀 있다. 두 사람은 서로 두 글자(이를 과 라 하자)를 고른 뒤, 한 개 이상의 단어로 이루어진 수열 으로 두 글자를 잇는다. 이때 첫 단어 은 로 시작하고, 마지막 단어 은 로 끝나야 한다.
이웃한 두 단어 는 반드시 두 글자 이상 겹쳐야 한다. 단어 가 단어 와 글자만큼 겹친다는 것은, 의 마지막 글자가 의 처음 글자와 완전히 같다는 뜻이다. 예를 들어 아래 그림에서 a는 두 단어로 이루어진 수열 against students로 s와 이어진다.

각 수열에는 벌점이 매겨진다. 벌점은 수열에 포함된 글자 수와 같되, 겹치는 글자는 한 번만 센다. (즉, 단어들을 최대한 겹치도록 늘어놓았을 때의 전체 너비와 같다.) 벌점이 작을수록 좋다. 그림에서 against students의 벌점은 13이고, about outside ideas의 벌점은 11이다.
단어 사전이 주어질 때, 주어진 두 글자를 잇는 수열의 가능한 최소 벌점을 구하여라.
입력
입력은 하나 이상의 테스트 케이스로 이루어진다. 각 테스트 케이스는 단어 사전과, 그 사전을 이용해 이을 글자 쌍(질의)들의 목록으로 구성된다.
각 테스트 케이스의 첫 줄에는 사전에 있는 단어의 개수를 나타내는 양의 정수 가 주어진다. 이어지는 개의 줄에는 각각 단어가 하나씩 주어진다. 단어는 소문자로만 이루어지며, 길이가 64를 넘지 않는다. 한 사전에는 최대 50000개의 단어가 있다.
사전 다음에는 질의의 개수 가 주어지고, 이어서 개의 줄이 온다. 각 질의 줄에는 두 소문자 과 가 공백으로 구분되어 주어진다.
입력의 끝은 정수 만 있는 줄로 나타내며, 이 줄은 테스트 케이스에 포함되지 않는다.
출력
각 질의마다 한 줄씩 출력한다.
를 테스트 케이스 번호(1부터 시작), 를 그 테스트 케이스 안에서의 질의 번호(역시 1부터 시작)라 하자.
두 글자를 잇는 수열이 존재하면 a.b p를 출력한다. 여기서 는 사전 안의 모든 유효한 수열에 대한 최소 벌점이다. 두 글자를 잇는 수열이 존재하지 않으면 a.b 0을 출력한다.
비어 있지 않은 모든 수열의 벌점은 1 이상이므로, 0은 잇는 수열이 존재하지 않음을 분명하게 뜻한다. 실제 수열이 아니라 최소 벌점만 출력하면 된다.