poj2406 kmp 最小重複子串
阿新 • • 發佈:2018-12-24
這個題就是利用kmp的next函式,求組成主串的最小重複子串的長度。
如果字串下標從1開始的話,字串長度len
(1)若len mod ( len - next[len] ) = 0 那麼a[next[len]+1...len] 就是最小重複的子串
(2)若len mod ( len - next[len] ) !=0 那麼最小重複子串為字串本身
#include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; const int maxn=1000001; int n; int fail[maxn]; char a[maxn]; void kmp() { int i,j; j=-1; memset(fail,-1,sizeof(fail)); for(i=1;i<n;i++) { while(j>-1 && a[j+1]!=a[i]) j=fail[j]; if(a[j+1]==a[i]) j++; fail[i]=j; } } int main() { while(scanf("%s",&a)) { if(a[0]=='.') break; n=strlen(a); kmp(); if(n%(n-1-fail[n-1])==0) cout<<n/(n-1-fail[n-1])<<endl; else cout<<1<<endl; } return 0; }