티스토리 뷰

Algorithm/BOJ

1305 광고

henry1214 2018. 2. 27. 06:26

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



길이가 N인 광고판이 있고 광고(문자열)가 광고판을 꽉 채우면서 반복되서 나타난다. 이 때 가능한 광고의 길이 중 가장 짧은 것을 찾는 문제이다. 광고가 반복해서 밀려나면서 뒤에서도 나타난다. 따라서 광고판에서 prefix와 suffix가 같을 때 길이의 최대값을 구하고 N에서 이를 빼주면 가장 짧은 광고의 길이이다. 이는 KMP에서 실패 함수의 정의이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
int main()
{
    int n;
    string s;
    cin>>n>>s;
    vector<int> pi(n);
    pi[0]=0;
    for(int i=1,j=0;i<n;i++)
    {
        while(j>0 && s[i]!=s[j]) j=pi[j-1];
        if(s[i]==s[j]) pi[i]=++j;
        else pi[i]=0;
    }
    cout<<n-pi[n-1]<<'\n';
    return 0;
}
cs


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

1526 가장 큰 금민수  (0) 2018.02.28
1431 시리얼 번호  (0) 2018.02.27
1701 Cubeditor  (0) 2018.02.27
1786 찾기  (0) 2018.02.27
2698 인접한 비트의 개수  (0) 2018.02.26
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday