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

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

주기성

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

요약
각 이름에 대해 주기 집합이 원래 이름과 정확히 같은, 길이가 같으면서 사전순으로 가장 작은 비트 문자열을 구하고, 없으면 XXX를 출력한다.
난이도

어려움10점 중 9점

유형
문자열, 누적 합, 문자열 매칭, 그리디
정답자
아직 제출이 없습니다

문제

비토티아의 왕 바이테아사르는 신하들의 이름을 개혁하기로 했다. 비토티아 사람들의 이름에는 반복되는 조각이 자주 들어 있다. 예를 들어 이름 Abiabuabiab에는 조각 abiab가 두 번 나타난다. 바이테아사르는 각 신하의 이름을 원래 이름과 길이가 같은 비트열로 바꾸려 하며, 새 이름이 원래 이름의 반복 구조를 그대로 반영하기를 바란다.

편의상 대문자와 소문자는 같은 것으로 본다. 문자열 또는 비트열 w=w1w2…wkw = w_1 w_2 \dots w_k 에 대해, 1≤p<k1 \le p < k 인 정수 pp가 모든 i=1,…,k−pi = 1, \dots, k - p 에 대해 wi=wi+pw_i = w_{i+p} 를 만족하면 pp를 ww의 주기라고 한다. ww의 모든 주기를 모은 집합을 Per(w)\mathrm{Per}(w) 로 나타낸다. 예를 들어 Per(ABIABUABIAB)={6,9}\mathrm{Per}(\text{ABIABUABIAB}) = \{6, 9\}, Per(01001010010)={5,8,10}\mathrm{Per}(01001010010) = \{5, 8, 10\}, Per(0000)={1,2,3}\mathrm{Per}(0000) = \{1, 2, 3\} 이다.

바이테아사르는 모든 이름을 다음 조건을 만족하는 비트열로 바꾸기로 했다.

  • 원래 이름과 길이가 같다.
  • 원래 이름과 주기의 집합이 정확히 같다.
  • 위 두 조건을 만족하는 비트열 중 사전순으로 가장 작다.

예를 들어 ABIABUABIAB는 01001101001로, BABBAB는 010010으로, BABURBAB는 01000010으로 바뀐다.

신하들의 현재 이름을 새로운 비트열 이름으로 바꾸는 프로그램을 작성하라.

입력

첫 번째 줄에 바꿀 이름의 개수 kk 가 주어진다 (1≤k≤201 \le k \le 20). 이어지는 kk 개의 줄에 이름이 한 줄에 하나씩 주어진다. 각 이름은 영어 대문자로만 이루어지며, 길이는 최소 11, 최대 200 000200\,000 이다.

전체 배점의 30%에 해당하는 데이터에서는 모든 이름의 길이가 2020 이하이다.

출력

kk 개의 줄을 출력한다. ii 번째 줄에는 ii 번째 입력 이름에 대응하는 비트열(0과 1로만 이루어지며 사이에 구분자가 없는 문자열)을 출력한다. 어떤 이름에 대해 적절한 비트열이 존재하지 않으면 그 줄에는 대신 XXX(따옴표 제외)를 출력한다.

힌트

비트열 x1x2…xkx_1 x_2 \dots x_k 가 비트열 y1y2…yky_1 y_2 \dots y_k 보다 사전순으로 작다는 것은, 어떤 인덱스 ii (1≤i≤k1 \le i \le k) 가 존재하여 xi<yix_i < y_i 이고 모든 j=1,…,i−1j = 1, \dots, i - 1 에 대해 xj=yjx_j = y_j 인 경우를 뜻한다.

예제4

  1. 예제 1

    입력
    3
    ABIABUABIAB
    BABBAB
    BABURBAB
    
    예상 출력
    01001101001
    010010
    01000010
    
  2. 예제 2

    입력
    1
    A
    
    예상 출력
    0
    
  3. 예제 3

    입력
    6
    A
    AA
    AB
    AAA
    AAAA
    AABA
    
    예상 출력
    0
    00
    01
    000
    0000
    0010
    
  4. 예제 4

    입력
    1
    AAAAAAAA
    
    예상 출력
    00000000