티스토리 뷰
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 |