문제
백준 2179
설명
BruteForce 로도 풀리지만 LCP Array 를 써서 풀어보려고 했더니 나름 까다로워서 정리한다.
문제에서 다행히 문자열을 모두 다르게 주어 중복 문자열 판단은 하지 않아도 된다.
하지만 주어진 순서 상 가장 빠른 것을 선택하는 것이 어려웠다.
- 문자열들을 합칠 때 맨 앞에 사전순으로 가장 빠른 문자를 삽입해 Suffix Array 의 앞의 N 개가 완전한 문자열이 되게 한다.
- 문자열의 뒤에 가장 늦는 문자를 삽입해 문자열을 구분짓는다.
- LCP Array 를 구할 때 문자열 단위를 넘어서지 않도록 조건을 추가한다.
- 최대 LCP 값을 갖는 Suffix Array Index 를 모두 저장한 후 Suffix Array 값을 이용해 정렬을 하면 가장 앞의 값이 사전순으로 가장 빠르다. 이때 공통문자열이 앞쪽일 수도 있고 뒤쪽을 수도 있으므로 둘 중 최솟값을 저장한다.
- LCP 가 유지된다면 바로 Suffix Array 에서 인접하지 않아도 되므로 Suffix Array 상에서 탐색을 앞뒤로 한다.
시간 복잡도
O(\(\mathrm{N}\log{\mathrm{N}}\))
코드
댓글남기기