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

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

반복

시간 제한6초메모리 제한512 MB

요약
길이 n인 이진 문자열에서 어떤 씨앗 문자열을 최대한 많이 반복한 부분 문자열을 찾아 반복 횟수, 씨앗 길이, 1부터 세는 시작 위치를 출력한다.
난이도

어려움10점 중 8점

유형
문자열, 문자열 매칭, 정렬, 이분 탐색
정답자
아직 제출이 없습니다

문제

문자열 ss가 (k,l)(k, l)-반복이라는 것은, 길이 l≥1l \ge 1인 어떤 씨앗 문자열 tt를 k≥1k \ge 1번 이어 붙여 ss를 얻을 수 있다는 뜻이다. 예를 들어 문자열

s = abaabaabaaba

는 씨앗 문자열

t = aba

를 가진 (4,3)(4,3)-반복이다. 즉 씨앗 문자열 tt의 길이는 3이고, 전체 문자열 ss는 tt를 4번 반복해 얻는다.

다음 작업을 수행하는 프로그램을 작성하라. 입력으로 ‘a’와 ‘b’로만 이루어진 긴 문자열 uu가 주어진다. 프로그램은 uu의 부분 문자열로 등장하는 (k,l)(k,l)-반복 중에서 kk가 최대인 것을 찾아야 한다. 예를 들어 입력 문자열

u = babbabaabaabaabab

에는 5번 위치에서 시작하는 (4,3)(4,3)-반복 ss가 있다. uu에 4번보다 더 많이 반복되는 연속 부분 문자열이 없으므로, 프로그램은 이 부분 문자열을 출력해야 한다.

입력

첫째 줄에 입력 문자열의 길이 nn이 주어진다 (1≤n≤500001 \le n \le 50000).

다음 nn개 줄에 입력 문자열이 한 줄에 한 문자씩 (‘a’ 또는 ‘b’) 순서대로 주어진다.

출력

출력은 세 정수로 이루어지며, 각각을 한 줄에 출력한다. 이 정수들은 프로그램이 찾은 (k,l)(k, l)-반복을 다음과 같이 나타낸다.

  1. 첫째 줄에는 최대화한 반복 횟수 kk를 출력한다.
  2. 둘째 줄에는 kk번 반복되는 씨앗 문자열의 길이 ll을 출력한다.
  3. 셋째 줄에는 (k,l)(k, l)-반복이 시작하는 위치 pp를 출력한다 (1≤p≤n1 \le p \le n).

주어진 입력에 대해 kk가 같은 답이 여러 개라면 그중 아무거나 출력해도 된다.

힌트

입력 문자열의 5번째 문자(입력의 6번째 줄)에서 시작하는 (4,3)(4, 3)-반복이 존재한다.

예제1

  1. 예제 1

    입력
    17
    b
    a
    b
    b
    a
    b
    a
    a
    b
    a
    a
    b
    a
    a
    b
    a
    b
    
    예상 출력
    4
    3
    5