문제 링크
- http://icpc.me/8235
문제 출처
- 2011/2012 POI Stage 3 6번
사용 알고리즘
- Hashing
시간복잡도
- $O(N)$
풀이
Prefix와 Suffix를 각각 어떤 문자열 A,B에 대해 A+B와 B+A로 나타낼 수 있습니다.
주어진 문자열 T를 T = P + X + S
로 분할하는 문제를 T = A + B + X + B + A
로 분할하는 문제로 바꿀 수 있습니다.
Naive한 풀이로는 가능한 모든 A에 대해 가능한 모든 B를 보는 것으로, 해싱을 이용해 $O(N^2)$에 해결할 수 있습니다. 이 풀이를 $O(N)$ 풀이로 발전시킬 수 있습니다.
위 그림에서 A를 초록색 길이만큼 고정시켰을 때, 가능한 가장 긴 B를 파란색이라고 합시다.
잘 생각해보면, 현재 상황에서 A가 한 칸 줄어들 때 B는 최대 두 칸 늘어날 수 있습니다. 이 점을 이용하면 A의 끝점을 나타내는 포인터와 B의 끝점을 나타내는 포인터 모두 O(N)번 움직이게 해서 $O(N)$에 풀 수 있습니다.
전체 코드
1 |
|