Doby's Lab

백준 1305번: 광고 (C++) 본문

PS/BOJ

백준 1305번: 광고 (C++)

도비(Doby) 2022. 8. 10. 22:08

https://www.acmicpc.net/problem/1305

 

1305번: 광고

세준이는 길 한가운데에서 전광판을 쳐다보고 있었다. 전광판에는 광고가 흘러나오고 있었다. 한참을 전광판을 쳐다본 세준이는 이 광고가 의미하는 것이 무엇인지 궁금해지기 시작했다. 전광

www.acmicpc.net


Solved By: KMP

 

주어진 광고에서 앞(접두사)과 뒤(접미사)가 얼마나 중복되는지 길이를 안다면 전체 길이에서 그 길이를 빼서 얼마큼만 광고해도 되는지 구할 수 있다.

 

이때 문자열 알고리즘 KMP를 사용한다.

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main(){
    int l; string s;
    cin >> l >> s;
    vector<int> pattern(l + 1);
    for(int i = 1, j = 0; i < l; i++){
        while(j > 0 && s[i] != s[j]){
            j = pattern[j - 1];
        }
        
        if(s[j] == s[i]){
            pattern[i] = ++j;
        }
    }
    
    cout << l - pattern[l - 1];
    return 0;
}

 

728x90

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

백준 1854번: K번째 최단경로 찾기 (C++)  (1) 2022.08.24
백준 13306번: 트리 (C++)  (0) 2022.08.13
백준 13706번: 제곱근 (Python)  (0) 2022.08.08
백준 14935번: FA (Python)  (0) 2022.08.08
백준 7501번: Key (C++)  (0) 2022.08.07