Crypt Kicker

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

요약
단어 사전이 주어질 때 각 줄의 치환 암호를 풀어 모든 단어가 사전에 있도록 복호화하고, 가능한 해가 여러 개면 사전순으로 가장 작은 줄을 출력하며, 해가 없으면 알파벳을 별표로 바꿔 출력한다.
난이도

어려움10점 중 8점

유형
백트래킹, 문자열, 완전 탐색, 구현
정답자
아직 제출이 없습니다

문제

알파벳 문자를 서로 치환하여 글을 암호화하는, 흔하지만 안전하지 않은 방법이 있다. 암호문에서는 각 알파벳 문자가 언제나 같은 다른 문자로 바뀐다. 복호화가 가능하도록, 서로 다른 두 문자가 같은 문자로 바뀌는 일은 없다(치환은 일대일 대응이다).

여러 줄의 암호문을 복호화하라. 각 줄은 서로 독립적인 치환 규칙을 사용하며, 복호화된 글의 모든 단어는 주어진 사전에 들어 있는 단어여야 한다.

입력

첫 줄에 정수 nn이 주어지고, 이어서 nn개의 소문자 단어가 사전순으로 한 줄에 하나씩 주어진다. 이 nn개의 단어가 복호화된 글에 나타날 수 있는 단어들의 사전을 이룬다.

사전 다음에는 복호화할 여러 줄이 입력의 끝까지 이어진다. 각 줄은 위에서 설명한 방식으로 암호화되어 있다.

사전 단어는 최대 10001000개이며, 각 단어의 길이는 1616자를 넘지 않는다. 각 암호문 줄은 소문자와 공백만으로 이루어지며 길이는 최대 8080자다.

출력

각 줄을 복호화하여 표준 출력으로 인쇄하라. 한 줄에 대해 유효한 복호화가 여러 가지이면, 사전순으로 가장 앞서는(가장 작은) 복호화 결과를 인쇄하라. 복호화가 불가능한 줄은 모든 소문자를 별표(*)로 바꾸고 공백은 그대로 두어 출력하라.

예제3

  1. 예제 1

    입력
    6
    and
    dick
    jane
    puff
    spot
    yertle
    bjvg xsb hxsn xsb qymm xsb rqat xsb pnetfn
    xxxx yyy zzzz www yyyy aaa bbbb ccc dddddd
    
    예상 출력
    dick and jane and puff and spot and yertle
    **** *** **** *** **** *** **** *** ******
    
  2. 예제 2

    입력
    2
    cat
    dog
    xyz
    
    예상 출력
    cat
    
  3. 예제 3

    입력
    1
    cat
    abcd
    
    예상 출력
    ****