티스토리 뷰
https://www.acmicpc.net/problem/1701
어떤 문자열의 모든 부분 문자열은 모든 suffix의 prefix들이다. 이를 이용하여 두 번 이상 나오는 부분 문자열 중에서 가장 긴 것은 모든 suffix의 pi 배열을 구해서 최대값을 구해주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <iostream> #include <vector> #include <string> using namespace std; int main() { string str; cin>>str; int len=str.size(),ans=0; for(int k=0;k<len-1;k++) { string s=str.substr(k,len); vector<int> pi(len-k); pi[0]=0; for(int i=1,j=0;i<len-k;i++) { while(j>0 && s[i]!=s[j]) j=pi[j-1]; if(s[i]==s[j]) pi[i]=++j; else pi[i]=0; ans=ans>pi[i]?ans:pi[i]; } } cout<<ans<<'\n'; return 0; } | cs |
'Algorithm > BOJ' 카테고리의 다른 글
1431 시리얼 번호 (0) | 2018.02.27 |
---|---|
1305 광고 (0) | 2018.02.27 |
1786 찾기 (0) | 2018.02.27 |
2698 인접한 비트의 개수 (0) | 2018.02.26 |
2660 회장뽑기 (0) | 2018.02.26 |