Coding Test/알고스팟
[C++] 알고스팟/접미사 배열 - 말버릇
Junchoi
2020. 9. 4. 14:00
문제 링크
https://algospot.com/judge/problem/read/HABIT
접미사 배열을 이용해서 푸는 문제입니다.
접미사 배열이란 문자열에서 나타날 수 있는 모든 접미사들을 사전순으로 정렬해 둔 배열을 말합니다.
banana 라는 문자열의 접미사는 아래와 같이 총 6개가 있습니다.
이 접미사들을 사전순으로 정렬을 하면 a가 가장 먼저오고 na가 가장 마지막에 오게됩니다.
이렇게 정렬된 각 접미사들의 전체 문자열 시작위치가 접미사 배열이 됩니다.
예시에서 접미사 a의 시작위치는 banana의 가장 마지막인 5가 되고
접미사 na의 시작위치는 4가 됩니다.
문제에서 부분 문자열이 k번 이상만큼 여러번 나오려면 항상 인접한 접미사들의 접두사로 나오게됩니다.
따라서 인접한 모든 접미사의 공통 접두사가 k번 이상 나오는지를 접미사 배열을 통해 확인하면 됩니다.
위에서 구한 접미사 배열을 순서대로 살펴보면
1번부터 3번까지의 접미사들의 접두사가 모두 a로 같기 때문에 s에서 가장 많이 나오는 부분 문자열이 됩니다.
문제 링크