아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

단어 사전 변환

시간 제한12초메모리 제한128 MB

요약
직접 번역 쌍들 사이 번역 사슬로 연결된 질의 단어의 목표 언어 번역어를 모두 사전 순으로 출력합니다.
난이도

보통10점 중 5점

유형
유니온 파인드, 해시맵, 정렬
정답자
아직 제출이 없습니다

문제

여러 언어 사이의 단어 대 단어 직접 번역이 아주 긴 목록으로 주어집니다. 각 항목은 "언어 AA의 단어 S1S_1은 언어 BB의 단어 S2S_2에 대응한다"라는 형태입니다.

다음과 같은 질의에 답하는 프로그램을 작성하세요: 단어 SS를 언어 AA에서 언어 BB로 옮긴 모든 번역을 찾아라.

번역 관계는 추이적(transitive) 입니다. 즉, 언어 BB의 단어 S2S_2가 언어 AA의 단어 S1S_1의 번역이 되려면, 이웃한 두 쌍이 항상 서로의 직접 번역인 (단어, 언어) 쌍의 사슬이 존재하여 (S1,A)(S_1, A)에서 시작해 (S2,B)(S_2, B)까지 이어지면 됩니다.

형식적으로, (단어, 언어) 쌍의 수열 (Xi,Ji)(X_i, J_i)가 존재하여 (S1,A)(S_1, A)가 (X1,J1)(X_1, J_1)의 직접 번역이고, (X1,J1)(X_1, J_1)이 (X2,J2)(X_2, J_2)의 직접 번역이며, …\dots, (Xk,Jk)(X_k, J_k)가 (S2,B)(S_2, B)의 직접 번역이면 됩니다.

직접 번역 관계는 대칭적(symmetric) 입니다. 즉, 목록의 각 항목은 두 단어가 서로의 번역임을 뜻합니다.

입력

첫 줄에는 테스트 세트의 개수 ZZ가 주어집니다 (1≤Z≤101 \le Z \le 10).

각 테스트 세트는 다음과 같이 주어집니다.

  • 첫 줄에는 직접 번역의 개수 NN이 주어집니다 (1≤N≤400001 \le N \le 40000).
  • 이어지는 NN개의 줄에는 각각 네 개의 단어 S1S_1, AA, S2S_2, BB가 주어집니다. 이는 언어 AA의 단어 S1S_1과 언어 BB의 단어 S2S_2가 서로 직접 번역임을 뜻합니다.
  • 그다음 줄에는 질의의 개수 MM이 주어집니다 (1≤M≤100001 \le M \le 10000).
  • 이어지는 MM개의 줄에는 각각 세 개의 단어 SS, AA, BB로 이루어진 질의가 주어집니다.

입력에 등장하는 단어의 길이는 최대 2020자이며, 모든 단어는 영어 소문자(aa-zz)로만 이루어집니다. 한 줄의 단어들은 공백 하나로 구분됩니다.

출력

각 질의 (S,A,B)(S, A, B)에 대해 한 줄을 출력합니다.

  • 단어 SS를 언어 BB로 옮긴 번역을 하나도 추론할 수 없으면 ?를 출력합니다.
  • 그렇지 않으면 단어 SS를 언어 BB로 옮긴 모든 번역을 사전순으로, 쉼표로 구분하여 (공백 없이) 출력합니다.

모든 단어는 자기 자신과도 연결되어 있으므로, A=BA = B인 질의에서는 단어 SS 자신도 결과에 포함됩니다.

출력해야 하는 전체 데이터의 양은 20 MB20\,\text{MB}를 넘지 않는다고 가정해도 좋습니다.

예제1

  1. 예제 1

    입력
    2
    2
    drzwi pl door en 
    puerta es door en 
    2
    drzwi pl es
    door en pl
    3
    a x b y
    b y c y
    c y d y
    3
    a x y
    d y y
    acc tle wa
    
    예상 출력
    puerta
    drzwi
    b,c,d
    b,c,d
    ?