article thumbnail image
Published 2021. 7. 10. 19:42

문제 설명

풀이

kmp의 실패 함수를 이용하여 풀이할 수 있다.

전체 문자열 길이를 L, 실패함수 배열을 pi (pi는 0 인덱스부터 시작)라 하면 L - pi[L-1]로 문제의 정답을 구할 수 있다.

abcdab라는 문자열이 있을 때 pi[L-1]은 2이고 이 수는 반복되는 패턴 문자열인 abcd가 끝나고, 패턴 문자열 앞부분 ab 2 글자가 패턴 문자열에 붙은 거라고 볼 수 있다.

코드

#include <cstdio>

char s[1000006];
int pi[1000006], L;

int main() {
    scanf("%d %s", &L, s);
    int j = 0;
    for (int i = 1; i < L; i++) {
        while (j > 0 && s[i] != s[j]) j = pi[j - 1];
        if (s[i] == s[j]) pi[i] = ++j;
    }
    printf("%d", L - pi[L - 1]);
}

'Algorithm > BOJ' 카테고리의 다른 글

백준[13506] 카멜레온 부분 문자열  (0) 2021.07.11
백준[2252] 줄 세우기  (0) 2021.07.10
백준[4354] 문자열 제곱  (0) 2021.07.09
백준[3033] 가장 긴 문자열  (0) 2021.07.08
백준[1786] 찾기  (0) 2021.07.06
복사했습니다!