주기

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

요약
문자열의 모든 접두사에 대해 그 접두사가 어떤 문자열 A를 K번 반복한 형태가 되는 최대 K를 KMP 실패 함수로 구하는 문제입니다.
난이도

보통10점 중 4점

유형
문자열 매칭, 문자열, 구현
정답자
아직 제출이 없습니다

문제

아스키 코드 값이 9797 이상 126126 이하인 문자 NN개로 이루어진 문자열 SS가 주어진다. 문자열 SS의 모든 접두사에 대해, 그 접두사가 주기적인 문자열인지 판별하려고 한다.

구체적으로, 2≤i≤N2 \le i \le N인 각 ii에 대해 길이가 ii인 SS의 접두사를 생각하자. 이 접두사를 어떤 문자열 AA를 KK번 이어 붙인 형태 AKA^K로 나타낼 수 있는 가장 큰 K>1K > 1을 구하려 한다.

여기서 AKA^K는 문자열 AA를 KK번 연속으로 이어 붙여 만든 문자열을 뜻한다. 예를 들어 AA가 abad이고 K=3K = 3이면 AKA^K는 abadabadabad이다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 두 줄로 구성된다. 첫 번째 줄에는 문자열 SS의 길이를 나타내는 정수 NN이 주어진다 (2≤N≤1062 \le N \le 10^6). 두 번째 줄에는 문자열 SS가 주어진다. 입력의 끝은 00 하나만 있는 줄로 나타낸다.

출력

각 테스트 케이스마다 Test case #에 이어 테스트 케이스 번호를 붙여 한 줄에 출력한다. 그 후, 길이가 ii인 접두사를 AKA^K 꼴로 나타낼 수 있는 가장 큰 KK가 K>1K > 1인 경우, 접두사의 길이 ii와 그 값 KK를 공백으로 구분하여 한 줄에 출력한다. 이때 접두사의 길이 ii가 오름차순이 되도록 출력한다. 각 테스트 케이스의 답을 출력한 뒤에는 빈 줄을 한 줄 출력한다.

예제1

  1. 예제 1

    입력
    3
    aaa
    12
    aabaabaabaab
    0
    
    예상 출력
    Test case #1
    2 2
    3 3
    
    Test case #2
    2 2
    6 2
    9 3
    12 4