암호
면접 대비시간 제한1초메모리 제한512 MB
카이사르 암호로 암호화된 메시지에 대해 26가지 시프트를 모두 시도하여 알려진 위협 및 비위협 단어와 가장 많이 일치하는 시프트를 찾고, 평문과 일치 비율을 출력한다.
문제
당신은 여러 위협을 찾아내기 위해 메시지를 분석하는 일을 맡았다. 하지만 메시지는 암호화되어 있다. 다행히도 메시지는 카이사르 암호로만 암호화되어 있는데, 이는 평문의 각 글자가 알파벳에서 고정된 수만큼 뒤로 이동한다는 뜻이다. 알파벳은 순환하므로 z 다음은 a이고, Z 다음은 A이다. 예를 들어 시프트 5로 암호화한 메시지 "How are you?"는 "Mtb fwj dtz?"가 된다. 메시지를 복호화하려면 글자를 반대 방향으로 이동하면 된다.
각 메시지에 대해 키(시프트 값)와 주어진 암호문에 대응하는 평문을 알아내야 한다. 이를 위해 알려진 위협 단어 목록과 알려진 비위협 단어 목록이 주어진다. 이 목록의 단어와 일치하는지 확인할 때는 대소문자를 구분하지 않는다. 예를 들어 "word"는 "Word"와 일치한다. 어떤 키가 다른 어떤 키보다 알려진 단어(위협 및 비위협)를 더 많이 만들어 내면 그 키를 올바르게 추측한 것으로 본다. 이 문제에서 단어는 A-Z 및/또는 a-z 문자 1 ≤ x ≤ 20개가 연속으로 이어진 것이다. 다른 모든 문자는 시프트의 영향을 받지 않으며 평문과 암호문에서 동일하다. 모든 메시지(평문과 암호문 모두)는 공백을 포함한 출력 가능한 문자로만 이루어진다.
입력
입력의 첫 줄에는 테스트 케이스의 수 C(1 ≤ C ≤ 50)가 주어진다. 각 테스트 케이스는 알려진 비위협 단어의 수 G(1 ≤ G ≤ 50)가 있는 줄로 시작한다. 다음 G개 줄에는 각각 소문자 비위협 단어가 하나씩 주어진다. 그다음 줄에는 알려진 위협 단어의 수 B(1 ≤ B ≤ 50)가 주어진다. 다음 B개 줄에는 각각 소문자 위협 단어가 하나씩 주어진다. 그다음 줄에는 1 ≤ y ≤ 1000개의 문자로 이루어진 암호문 메시지가 주어진다. 어떤 줄에도 앞뒤 공백은 없다.
출력
각 테스트 케이스는 한 줄 또는 두 줄을 출력한다.
키와 평문을 알아낼 수 있으면 첫 번째 줄에 원래 암호문의 대소문자와 문장 부호를 그대로 유지한 평문 메시지를 출력하고, 두 번째 줄에 "Shift: S, Match: M%, Threat: T%"를 출력한다. 여기서 S(0 ≤ S < 26)는 평문을 암호화하기 위해 이동한 문자 수, M은 평문의 단어 중 알려진 단어(위협 및 비위협)의 비율을 나타내는 정수, T는 평문의 단어 중 위협 단어의 비율을 나타내는 정수이다. 모든 백분율은 가장 가까운 1%로 반올림한다.
키와 평문을 알아낼 수 없으면 "Unable to decipher" 한 줄만 출력한다.