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;
}

  

posted @ 2016-10-30 20:57  北北北北屿  阅读(149)  评论(0编辑  收藏  举报