문자열 알고리즘

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

요약
모든 k에 대해 s를 길이 k의 블록으로 자르고 남는 부분을 버린 뒤, 해밍 거리가 1 이하인 블록 쌍의 개수를 구한다.
난이도

어려움10점 중 9점

유형
문자열, 해시맵, 문자열 매칭, 분할 정복
정답자
아직 제출이 없습니다

문제

길이 nn인 문자열 ss가 주어진다.

kk (1≤k≤n1 \le k \le n)를 고정하자. m=⌊n/k⌋m = \lfloor n/k \rfloor개의 길이 kk 문자열을 만들고, ii번째 문자열은 ss에서 위치 (i−1)k+1(i-1)k+1부터 시작하는 부분 문자열로 정의한다: pi=s(i−1)k+1s(i−1)k+2…sikp_i = s_{(i-1)k+1} s_{(i-1)k+2} \dots s_{ik}.

다시 말해, 문자열 ss를 길이 kk의 문자열들로 자르고 남는 부분은 버린다. f(k)=∣{(i,j)∣1≤i<j≤m,dist⁡(pi,pj)≤1}∣f(k) = |\{(i, j) \mid 1 \le i < j \le m, \operatorname{dist}(p_i, p_j) \le 1\}|로 정의한다. 여기서 dist⁡\operatorname{dist}는 해밍 거리이다. 즉, f(k)f(k)는 서로 다른 위치가 최대 1개인 문자열 쌍 pp의 개수이다.

k=1k = 1부터 nn까지 모든 kk에 대해 f(k)f(k)를 계산하는 알고리즘을 설계하라.

입력

첫째 줄에 양의 정수 nn이 주어진다 (1≤n≤2⋅1051 \le n \le 2 \cdot 10^5). nn은 문자열의 길이이다.

둘째 줄에 길이 nn인 문자열 ss가 주어진다. ss는 영소문자로만 이루어져 있다.

출력

nn개의 수를 출력한다. kk번째 수는 f(k)f(k)이다.

예제3

  1. 예제 1

    입력
    7
    kkekeee
    
    예상 출력
    21 2 1 0 0 0 0
    
  2. 예제 2

    입력
    10
    babaiskeke
    
    예상 출력
    45 2 0 0 0 0 0 0 0 0
    
  3. 예제 3

    입력
    11
    aaabaaabaaa
    
    예상 출력
    55 10 2 1 0 0 0 0 0 0 0