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

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

암호 해독

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

요약
주기적 순열이 주어진 평문을 암호문1로 바꿀 수 있는지 판정하고, 가장 작은 주기와 순열을 찾은 뒤 그 역순열로 암호문2를 복호화한다.
난이도

보통10점 중 6점

유형
구현, 시뮬레이션, 완전 탐색, 문자열
정답자
아직 제출이 없습니다

문제

주기적 순열(periodic permutation)은 간단한 암호화 기법이다. 먼저 주기 kk와 앞의 kk개 위치에 대한 순열 하나를 정한다. 메시지를 암호화하려면 문자를 kk개씩 묶고(마지막 묶음이 모자라면 채움 문자로 채운다) 각 묶음을 이 순열에 따라 재배열한다. 복호화는 문자를 kk개씩 묶은 뒤 역순열을 적용하면 된다.

예를 들어 k=4k = 4이고 순열이 2431이면 Mary는 yMra로 암호화된다. 같은 순열을 Maryan(Mary + an??로 채운 것)에 적용하면 yMra?a?n이 되며, 여기서 ?는 채움 문자를 나타낸다.

순열을 알아내면 같은 방식으로 만들어진 어떤 암호문이든 역순열을 적용하여 원문을 복원할 수 있다.

(평문, 암호문1, 암호문2) 세 쌍을 읽어, 각 (평문, 암호문1) 쌍에 대해 주기적 순열로 평문이 암호문1로 바뀔 수 있는지 판단하는 프로그램을 작성하라. 가능하다면 주기 kk와 순열을 찾은 뒤, 그 역순열을 암호문2에 적용하여 암호문2의 평문을 복원한다.

입력

입력은 (평문, 암호문1, 암호문2) 세 쌍의 나열이며, 한 줄에 문자열 하나씩 주어진다. 각 줄의 길이는 80자를 넘지 않는다. 한 세 쌍에서 처음 두 문자열은 길이가 같은 nn이며, 평문과 암호문의 처음 nn개 문자를 나타낸다. nn이 kk의 배수라는 보장은 없다. 입력은 # 한 글자만 있는 줄로 끝난다.

출력

각 세 쌍마다 한 줄을 출력한다. 평문과 암호문1 문자열의 길이 이하인 주기를 갖는 주기적 순열이 평문을 암호문1로 바꿀 수 있다면, 그 역순열을 암호문2에 적용하고 필요하면 ?로 채워 결과를 출력한다. 그런 순열이 없으면 암호문2를 그대로 출력한다. 여러 주기가 가능하면 가장 작은 주기 kk를 사용하며, 가장 작은 주기에서는 조건을 만족하는 순열이 항상 유일하다.

예제3

  1. 예제 1

    입력
    Mary had a little lamb!!
    aMyrh daa l tilt ealbm!!
    hTsii  s aetts
    Foobar
    blargg
    No cycle
    abc
    bca
    abcd
    #
    
    예상 출력
    This is a test
    No cycle
    cab?d?
    
  2. 예제 2

    입력
    hello
    hello
    world
    #
    
    예상 출력
    world
    
  3. 예제 3

    입력
    abcdef
    badcfe
    12345
    #
    
    예상 출력
    2143?5