Description
一个字符串最短周期.
Sol
KMP.
最短周期就是 (n-next[n])
证明:
当该字符串不存在周期的时候 (next[n]=0) 成立.
当存在周期的时候
(next[]) 表示的就是一个和当前后缀相等的前缀,由中间交错的位置可以分别推倒出相邻长度为 (n-next[n]) 的子串都相等.
差不多就这样子证吧...
Code
/************************************************************** Problem: 1355 User: BeiYu Language: C++ Result: Accepted Time:24 ms Memory:6172 kb ****************************************************************/ #include<cstdio> #include<cstring> #include<iostream> using namespace std; const int N = 1000005; int n,ans,t; char s[N]; int f[N]; int main(){ scanf("%d",&n); scanf("%s",s+1); f[1]=0; for(int i=2,j=0;i<=n;i++){ while(j && s[i]!=s[j+1]) j=f[j]; if(s[i]==s[j+1]) ++j; f[i]=j; } //for(int i=1;i<=n;i++) cout<<f[i]<<" ";cout<<endl; cout<<n-f[n]<<endl; return 0; }