BZOJ 1355: [Baltic2009]Radio Transmission
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;
}

浙公网安备 33010602011771号