비제네르 암호 분석
시간 제한1초메모리 제한128 MB
주어진 최대 키 길이 이하의 각 Vigenère 키 길이에 대해 복호화한 평문이 두 크립 단어를 겹치지 않게 포함하는지 확인해 평문을 출력하거나 ambiguous, impossible을 판별하는 문제입니다.
문제
비제네르(Vigenère) 암호는 반복되는 키로 메시지를 암호화한다. 평문과 키는 모두 대문자 알파벳 로 이루어진 문자열이며, 각 글자를 로 대응시킨다. 평문 와 키 가 주어지면, 암호문 는 와 길이가 같고 다음과 같이 정의된다.
결과를 다시 글자로 읽으며, 키 는 메시지 전체를 덮을 때까지 반복된다. 복호화는 그 역으로 이다.
비밀 조직인 아마추어 암호 해독 운동(Amateur Codebreakers Movement, ACM)은 은행 강도 일당이 다시 범행을 저지르려 한다고 강하게 의심하고 있다. 하지만 목표 은행의 이름도, 정확한 날짜와 시각도 알지 못한다. ACM 은 강도들과 도주 차량 운전자가 주고받는 메시지를 도청할 수 있지만, 모든 메시지는 비제네르 암호로 암호화되어 있다.
당신의 임무는 이 암호를 해독하는 것이다. 원래 평문에 나타날 가능성이 매우 높은 두 단어, 이른바 크립(crib) 이 주어진다. (이렇게 추측한 단어들은 예컨대 유명한 에니그마(Enigma) 기계를 해독할 때 결정적인 역할을 했다.)
입력
입력은 여러 개의 테스트 인스턴스로 이루어진다. 각 인스턴스는 네 줄로 구성된다.
- 첫째 줄에는 고려할 최대 키 길이인 정수 가 주어지며 이다.
- 둘째 줄과 셋째 줄에는 크립 과 가 주어지며 이다.
- 넷째 줄에는 암호문 가 주어지며 이다.
두 크립 와 암호문 는 모두 대문자 알파벳 로만 이루어진다. 입력은 하나만 있는 줄로 끝난다.
출력
각 인스턴스에 대해, 다음 조건을 모두 만족하는 서로 다른 평문의 개수를 구하라.
- 길이가 인 어떤 비제네르 키 로 평문을 암호화하면 주어진 암호문 와 정확히 같아진다.
- 평문 안에서 두 크립 과 가 서로 겹치지 않는 위치에 나타난다. 즉, 의 어떤 출현과 의 어떤 출현이 차지하는 글자 구간이 서로 겹치지 않는다.
각 인스턴스마다 한 줄씩 출력한다.
- 그러한 평문이 정확히 하나뿐이면, 그 평문을 추가 공백 없이 출력한다.
- 그러한 평문이 둘 이상이면
ambiguous를 출력한다. - 그러한 평문이 하나도 없으면
impossible을 출력한다.