만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

'우승' 유전자

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

요약
각 (K, L) 쌍마다 길이 K인 모든 구간에서 사전순으로 가장 작은 길이 L 부분 문자열의 시작 위치를 모으고, 위치 개수가 v인 쌍의 수를 셉니다.
난이도

어려움10점 중 8점

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

문제

Farmer John은 여러 해 동안 게임을 열면서 Bessie가 몇 번이고 1등을 차지하는 것을 지켜봤다. 이것이 우연일 리 없다고 판단한 그는 Bessie의 DNA에 "우승" 유전자가 들어 있다고 결론 내리고, 그 유전자를 찾아 나섰다.

그는 이 유전자의 후보를 찾는 절차를 고안했다. Bessie의 유전체는 길이 NN인 문자열 SS이며, 1≤N≤30001 \leq N \leq 3000이다. 그는 (K,L)(K,L) 쌍을 고른다. 여기서 1≤L≤K≤N1 \leq L \leq K \leq N이다. 유전자 후보의 길이는 LL이고, 길이 KK인 부분 문자열 안에 놓인다.

그는 SS에서 길이 KK인 부분 문자열을 모두 뽑는데, 이를 kk-mer라고 부른다. 각 kk-mer에서 길이 LL인 부분 문자열을 모두 구하고, 사전순으로 가장 앞선 것을 우승 유전자 후보로 고른다. 여럿이 같으면 가장 왼쪽의 것을 고른다. 그리고 그 부분 문자열이 SS에서 시작하는 0부터 세는 위치 pip_i를 집합 PP에 적는다.

아직 KK와 LL을 정하지 않은 그는 각 (K,L)(K,L) 쌍마다 후보가 몇 개 나오는지 알고 싶어 한다.

입력

첫 줄에 문자열의 길이 NN이 주어진다. 둘째 줄에 문자열 SS가 주어진다. SS의 모든 문자는 대문자 알파벳이며, si∈A−Zs_i \in A-Z이다.

출력

11부터 NN까지의 각 vv에 대해, ∣P∣=v|P|=v인 (K,L)(K,L) 쌍의 개수를 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    8
    AGTCAACG
    
    예상 출력
    11
    10
    5
    4
    2
    2
    1
    1