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

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

암호화 시스템

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

요약
암호화된 문자열을 연쇄 첫 문자 치환으로 만드는 모든 원본 문자열을 사전 순으로 나열합니다.
난이도

보통10점 중 6점

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

문제

어떤 프로그래머가 새 암호화 시스템을 만들었다. 그런데 이 시스템에는 서로 다른 두 개 이상의 문자열이 같은 문자열로 암호화되는 결함이 있다.

이 시스템으로 암호화한 문자열이 하나 있다. 원래 문자열을 복원하려면 암호화 전 문자열의 후보를 모두 나열해야 한다. 이 일을 하는 프로그램을 작성하시오.

암호화는 소문자('a'부터 'z')로만 이루어진 문자열에 다음 단계를 순서대로 적용한다.

  1. 첫 번째 'b'를 'a'로 바꾼다. 'b'가 없으면 아무것도 하지 않는다.
  2. 첫 번째 'c'를 'b'로 바꾼다. 'c'가 없으면 아무것도 하지 않는다.
  3. ...
  4. 첫 번째 'z'를 'y'로 바꾼다. 'z'가 없으면 아무것도 하지 않는다.

각 단계는 바로 앞 단계가 남긴 문자열에 적용한다. 후보도 소문자로만 이루어진 문자열이다.

입력

입력은 최대 100개의 데이터 집합으로 이루어진다. 각 데이터 집합은 암호화된 문자열 하나가 적힌 한 줄이다. 암호화된 문자열은 소문자로만 이루어지고, 길이는 1 이상 20 이하이다.

입력의 마지막 줄에는 '#' 한 글자만 있다.

출력

각 데이터 집합마다 암호화 전 문자열의 후보 개수 nn을 한 줄에 먼저 출력하고, 이어서 후보를 한 줄에 하나씩 출력한다. nn이 10 이하이면 후보를 모두 사전순으로 출력하고, 그렇지 않으면 사전순으로 앞의 다섯 개와 뒤의 다섯 개를 출력한다. nn이 0이면 0만 출력한다.

여기서 사전순은 다음과 같이 재귀적으로 정의한다. 빈 문자열이 사전순으로 가장 앞에 온다. 비어 있지 않은 두 문자열 x=x1…xkx = x_1 \dots x_k와 y=y1…yly = y_1 \dots y_l에 대해 다음 중 하나가 성립하면 xx가 yy보다 사전순으로 앞선다.

  • x1x_1이 알파벳 순서('a'부터 'z')에서 y1y_1보다 앞선다.
  • x1x_1과 y1y_1이 같은 문자이고, x2…xkx_2 \dots x_k가 y2…yly_2 \dots y_l보다 사전순으로 앞선다.

예제3

  1. 예제 1

    입력
    enw
    abc
    abcdefghijklmnopqrst
    z
    #
    
    예상 출력
    1
    fox
    5
    acc
    acd
    bbd
    bcc
    bcd
    17711
    acceeggiikkmmooqqssu
    acceeggiikkmmooqqstt
    acceeggiikkmmooqqstu
    acceeggiikkmmooqrrtt
    acceeggiikkmmooqrrtu
    bcdefghijklmnopqrrtt
    bcdefghijklmnopqrrtu
    bcdefghijklmnopqrssu
    bcdefghijklmnopqrstt
    bcdefghijklmnopqrstu
    0
    
  2. 예제 2

    입력
    a
    b
    y
    z
    #
    
    예상 출력
    2
    a
    b
    1
    c
    1
    z
    0
    
  3. 예제 3

    입력
    cfaabd
    fabeacd
    #
    
    예상 출력
    10
    dgaacd
    dgaace
    dgabbd
    dgabbe
    dgabcd
    dgabce
    dgbabd
    dgbabe
    dgbacd
    dgbace
    11
    gacface
    gacfadd
    gacfade
    gacfbce
    gacfbdd
    gbbfadd
    gbbfade
    gbcface
    gbcfadd
    gbcfade