문제 링크
- https://icpc.me/11590
문제 출처
- 2015/2016 COCI #2 4번
사용 알고리즘
- 해싱
- DP
풀이
문자열 $s$를 마지막 원소로 하는 가장 긴 부분 수열의 길이를 $D(s)$라고 정의합시다. $D(s)$는 $s$의 접두사이면서 접미사인 부분 문자열 $s’$에 대해 $D(s’) + 1$의 최댓값입니다.
어떤 문자열 $s$의 접두사이면서 동시에 접미사인 부분 분자열은 KMP 알고리즘의 실패 함수를 따라가면서 모두 구할 수 있습니다. 따라서 DP의 상태를 문자열이 아닌 해시값을 std::unordered_map
등을 이용해 관리하면 문제를 효율적으로 해결할 수 있습니다.
해시맵을 사용하는 경우 전체 시간 복잡도는 $O(\sum \vert S\vert)$입니다.
전체 코드
1 |
|