문제
백준 25564
설명
서로다른 부분 문자열은 LCP Array 로 구할 수 있다. 요약하면 모든 부분 문자열은 Suffix 의 Prefix 라고 생각할 수 있고, 그 중 중복인 것은 LCP Array 의 값과 같다.
팰린드롬은 매내처 알고리즘을 사용하면 문자열의 인덱스마다 그것을 중심으로 한 팰린드롬의 반지름을 얻을 수 있다. 팰린드롬은 앞뒤를 떼어내도 팰린드롬이므로, 인덱스마다 K
보다 크면서 가장 작은 길이의 부분 팰린드롬을 얻을 수 있다. 이를 G
라고 하자.
Suffix 의 시작 인덱스 i
가 주어졌을 때
- 중복되지 않는 모든 부분문자열은
i + lcp[rk[i]]
부터 시작하는 Prefix 가 된다.
- 팰린드롬을 포함하는 부분문자열은
G
중에서 끝이 i
보다 크면서 가장 작은 부분 팰린드롬을 포함해야한다.
두 조건을 합치면 아래와 같은 코드를 얻을 수 있다.
시간 복잡도
O(\(\mathrm{N} \log{\mathrm{N}}\))
코드
댓글남기기