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

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

가장 긴 부분 문자열

시간 제한5초메모리 제한1024 MB

요약
문자열 S에서 각 k에 대해 정확히 k번 나타나는 부분문자열 중 겹치지 않게 가장 많이 고를 수 있는 것의 최대 길이를 구합니다.
난이도

어려움10점 중 8점

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

문제

길이가 n≥1n ≥ 1인 문자열 SS와 양의 정수 kk (1≤k≤n1 ≤ k ≤ n)에 대해, SS의 비어 있지 않은 부분 문자열 TT가 정확히 kk번 나타나면 TT를 kk-부분 문자열이라고 한다. 이 kk번의 출현은 서로 겹칠 수 있다. 예를 들어 S=S = "ababa"이면 k=1,…,5k = 1, \dots , 5에 대한 kk-부분 문자열은 다음과 같다.

  • SS에서 정확히 한 번 나타나는 1-부분 문자열은 네 개이다. "abab", "ababa", "bab", "baba"가 그것이다. "aba"는 두 번 나타나므로 1-부분 문자열이 아니다.
  • 2-부분 문자열은 네 개이다. "ab", "aba", "b", "ba"가 그것이다. "ab"는 겹치지 않게 정확히 두 번 나타난다. "aba"의 두 출현은 문자 "a"에서 겹치며, 세 번 나타나지는 않는다.
  • 3-부분 문자열은 "a" 하나뿐이다.
  • 4-부분 문자열과 5-부분 문자열은 존재하지 않는다.

kk-부분 문자열 TT에 대해 d(T)d(T)는 SS에서 TT의 출현 중 서로 겹치지 않는 출현을 최대 몇 개 고를 수 있는지를 뜻한다. 예를 들어 "ab"는 겹치지 않게 두 번 고를 수 있으므로 d("ab")=2d("ab") = 2이다. 2-부분 문자열 "aba"는 겹치지 않게 두 번 고를 수 없으므로 d("aba")=1d("aba") = 1이다. 3-부분 문자열 "a"는 d("a")=3d("a") = 3이다.

f(k)f(k)는 1≤k≤n1 ≤ k ≤ n에 대해, kk-부분 문자열 중 d(T)d(T)가 가장 큰 것들 가운데 가장 긴 TT의 길이이다. S=S = "ababa"이면 f(1)=5f(1) = 5, f(2)=2f(2) = 2, f(3)=1f(3) = 1, f(4)=f(5)=0f(4) = f(5) = 0이다.

입력

첫 줄에 길이 nn (1≤n≤50 0001 ≤ n ≤ 50\,000)의 영어 소문자로 이루어진 문자열 SS가 주어진다.

출력

공백으로 구분한 nn개의 음이 아닌 정수를 한 줄에 출력한다. 순서는 f(1)f(1) f(2)f(2) …\dots f(n)f(n)이다. 어떤 kk에 대해 kk-부분 문자열이 없으면 f(k)f(k)는 0이다.

예제2

  1. 예제 1

    입력
    ababa
    
    예상 출력
    5 2 1 0 0
    
  2. 예제 2

    입력
    aaaaaaaa
    
    예상 출력
    8 7 6 5 4 3 2 1