문제 링크
- https://icpc.me/9483
사용 알고리즘
- Suffix Array
시간복잡도
- $O(N \log N)$
풀이
주기가 $p$인 tandem의 개수를 세는 프로시저가 있으면, $p = 1, 2, \cdots, N$에 대해 호출해서 문제를 해결할 수 있습니다.
문자열을 $p$글자씩 분할해서 $B[i]$를 $i$번째 블록이라고 정의합시다. 주기가 $p$인 tandem repeats는 두 가지 형태 중 하나에 해당합니다.
- $B[i] = B[i+1]$
$S$의 LCP 배열에서 RMQ를 하면 블록마다 1번의 RMQ로 확인 가능 - $(B[i], B[i+1])$의 최장 공통 접두사 + $(B[i], B[i+1])$의 최장 공통 접미사 $\geq p$
블록마다 $S$의 LCP 배열과 $S$를 뒤집은 문자열의 $LCP$ 배열에서 각각 1번의 RMQ로 확인 가능
sparse table 등을 이용해 RMQ를 하면 두 가지 경우 모두 각 블록마다 상수 시간에 처리할 수 있으므로 주기가 $p$인 tandem repeats의 개수를 $O(n/p)$ 시간에 구할 수 있습니다.
$\sum N/p = O(N \log N)$이므로 전체 시간 복잡도는 $O(N \log N)$입니다.
전체 코드
1 |
|