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

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

단어 인코딩

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

요약
길이 1~3의 금지 문자열을 최대 1000개 줄 때, 유효한 단어를 길이순, 그 다음 사전순으로 번호를 매기고 단어를 번호로, 번호를 단어로 바꾸는 질의에 답한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 문자열 매칭, 조합론, 구현
정답자
아직 제출이 없습니다

문제

어떤 언어에서든 특정한 글자 조합은 절대 나타나지 않거나, 거의 나타나지 않아 존재하지 않는다고 볼 수 있습니다. 예를 들어 영어 단어 중에는 부분 문자열로 buv를 포함하는 것이 없습니다.

나타날 수 없는 글자 조합의 목록이 주어지면, 그 언어에서 가능한 "단어"의 수는 크게 줄어듭니다. 여기서 "단어"란 주어진 금지 조합 중 어느 것도 부분 문자열로 포함하지 않는, 소문자로만 이루어진 임의의 문자열을 뜻합니다.

모든 유효한 단어를 길이가 짧은 순서로, 길이가 같으면 사전순으로 나열하고 1번부터 번호를 매깁니다.

예를 들어 금지 조합이 q, ab, aaa뿐이라면 단어에는 다음과 같이 번호가 매겨집니다.

1.   a
2.   b
...
16.  p
17.  r
...
26.  aa
27.  ac
...
649. zz
650. aac

금지 조합 목록이 주어질 때, 주어진 단어에 대해서는 그 번호를, 주어진 번호에 대해서는 그 단어를 출력하는 프로그램을 작성하세요.

모든 단어의 길이는 최대 20자이며, 입력과 출력에 등장하는 어떤 번호도 2,000,000,000을 넘지 않습니다. 알파벳은 항상 소문자 a부터 z까지입니다.

입력

첫째 줄에 테스트 케이스의 수 TT가 주어집니다.

각 테스트 케이스의 첫째 줄에는 두 정수 NN과 MM이 주어집니다. NN은 금지 조합의 개수 (0≤N≤10000 \le N \le 1000), MM은 질의의 개수 (1≤M≤1001 \le M \le 100)입니다.

이어지는 NN개의 줄에는 각각 길이가 1 이상 3 이하인 소문자 금지 조합이 하나씩 주어집니다.

그 다음 MM개의 줄에는 각각 질의가 하나씩 주어지며, 양의 정수이거나 소문자 단어입니다. 단어 질의는 해당 테스트 케이스의 어떤 금지 조합도 포함하지 않으며, 번호 질의는 유효한 단어의 총 개수를 넘지 않습니다.

출력

각 질의마다 한 줄에 답을 출력합니다. 단어가 주어지면 그 번호를, 번호가 주어지면 그 단어를 출력합니다.

예제1

  1. 예제 1

    입력
    2
    3 4
    q
    ab
    aaa
    16
    r
    27
    aac
    7 2
    a
    b
    c
    d
    ef
    ghi
    ijk
    102345678
    ksvfuw
    
    예상 출력
    p
    17
    ac
    650
    xexgun
    39174383