비제네르 암호 분석

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

요약
주어진 최대 키 길이 이하의 각 Vigenère 키 길이에 대해 복호화한 평문이 두 크립 단어를 겹치지 않게 포함하는지 확인해 평문을 출력하거나 ambiguous, impossible을 판별하는 문제입니다.
난이도

어려움10점 중 8점

유형
문자열 매칭, 문자열, 완전 탐색, 구현
정답자
아직 제출이 없습니다

문제

비제네르(Vigenère) 암호는 반복되는 키로 메시지를 암호화한다. 평문과 키는 모두 대문자 알파벳 {A,B,…,Z}\{A, B, \ldots, Z\} 로 이루어진 문자열이며, 각 글자를 A=0,B=1,…,Z=25A = 0, B = 1, \ldots, Z = 25 로 대응시킨다. 평문 PP 와 키 QQ 가 주어지면, 암호문 CC 는 PP 와 길이가 같고 다음과 같이 정의된다.

Ci=(Pi+Qi mod ∣Q∣) mod 26C_i = (P_i + Q_{i \bmod |Q|}) \bmod 26

결과를 다시 글자로 읽으며, 키 QQ 는 메시지 전체를 덮을 때까지 반복된다. 복호화는 그 역으로 Pi=(Ci−Qi mod ∣Q∣) mod 26P_i = (C_i - Q_{i \bmod |Q|}) \bmod 26 이다.

비밀 조직인 아마추어 암호 해독 운동(Amateur Codebreakers Movement, ACM)은 은행 강도 일당이 다시 범행을 저지르려 한다고 강하게 의심하고 있다. 하지만 목표 은행의 이름도, 정확한 날짜와 시각도 알지 못한다. ACM 은 강도들과 도주 차량 운전자가 주고받는 메시지를 도청할 수 있지만, 모든 메시지는 비제네르 암호로 암호화되어 있다.

당신의 임무는 이 암호를 해독하는 것이다. 원래 평문에 나타날 가능성이 매우 높은 두 단어, 이른바 크립(crib) 이 주어진다. (이렇게 추측한 단어들은 예컨대 유명한 에니그마(Enigma) 기계를 해독할 때 결정적인 역할을 했다.)

입력

입력은 여러 개의 테스트 인스턴스로 이루어진다. 각 인스턴스는 네 줄로 구성된다.

  • 첫째 줄에는 고려할 최대 키 길이인 정수 KK 가 주어지며 1≤K≤1001 \le K \le 100 이다.
  • 둘째 줄과 셋째 줄에는 크립 W1W_1 과 W2W_2 가 주어지며 1≤K≤∣Wi∣≤1001 \le K \le |W_i| \le 100 이다.
  • 넷째 줄에는 암호문 CC 가 주어지며 1≤∣C∣≤1000001 \le |C| \le 100000 이다.

두 크립 W1,W2W_1, W_2 와 암호문 CC 는 모두 대문자 알파벳 {A,B,C,…,Z}\{A, B, C, \ldots, Z\} 로만 이루어진다. 입력은 00 하나만 있는 줄로 끝난다.

출력

각 인스턴스에 대해, 다음 조건을 모두 만족하는 서로 다른 평문의 개수를 구하라.

  • 길이가 1≤∣Q∣≤K1 \le |Q| \le K 인 어떤 비제네르 키 QQ 로 평문을 암호화하면 주어진 암호문 CC 와 정확히 같아진다.
  • 평문 안에서 두 크립 W1W_1 과 W2W_2 가 서로 겹치지 않는 위치에 나타난다. 즉, W1W_1 의 어떤 출현과 W2W_2 의 어떤 출현이 차지하는 글자 구간이 서로 겹치지 않는다.

각 인스턴스마다 한 줄씩 출력한다.

  • 그러한 평문이 정확히 하나뿐이면, 그 평문을 추가 공백 없이 출력한다.
  • 그러한 평문이 둘 이상이면 ambiguous 를 출력한다.
  • 그러한 평문이 하나도 없으면 impossible 을 출력한다.

예제4

  1. 예제 1

    입력
    4
    BANK
    MONEY
    FTAGUAVMKILCKPRIJCHRJZIYUAXFNBSLNNXMVDVPXLERWDSL
    5
    SECOND
    PARSEC
    SUKCTZHYYES
    3
    ACM
    IBM
    JDNCOFBEN
    4
    ABCD
    EFGH
    OPQRHKLMN
    0
    
    예상 출력
    WEWILLROBTHEBANKANDTAKEALLTHEMONEYTOMORROWATNOON
    impossible
    ambiguous
    EFGHXABCD
    
  2. 예제 2

    입력
    5
    QUICK
    JUMPS
    DLCAYGMOZBSUXJMHNSWTQ
    0
    
    예상 출력
    THEQUICKBROWNFOXJUMPS
    
  3. 예제 3

    입력
    4
    GOOD
    SHINE
    WEETCEHDYDWIKDIXYDU
    0
    
    예상 출력
    GOODMORNINGSUNSHINE
    
  4. 예제 4

    입력
    2
    AB
    BA
    AAAAAAAA
    0
    
    예상 출력
    ambiguous