poj1961—Period(kmp周期性质)

来源:互联网 发布:域名解析记录值 端口 编辑:程序博客网 时间:2024/05/17 22:31

传送门:点我

Sample Input

3aaa12aabaabaabaab0

Sample Output

Test case #12 23 3Test case #22 26 29 312 4
题意:给一个字符串判断前缀是否构成周期串,输出周期串长度和周期数

知识点:如果一个字符串有最小周期,那么循环节为n-next[n],周期数为n / (n-next[n])

证明:http://blog.csdn.net/zz_ylolita/article/details/50650394

贴代码:

#include<iostream>#include<cstdio>#include<cstring>#define N 1000005using namespace std;char s[N];int Next[N];void getnext(int n){    int i,j,len;    for(j=0,i=1; i<n; i++)    {        while(j>0&&s[i]!=s[j])            j=Next[j-1];        if(s[i]==s[j])            j++;        Next[i]=j;        if(Next[i]!=0)        {            len=i+1;            if(len%(len-Next[i])==0)                printf("%d %d\n",len,len/(len-Next[i]));        }    }}int main(){    int t,cat=0;    while(scanf("%d",&t),t)    {        Next[0]=0;        scanf("%s",s);        int len=strlen(s);        printf("Test case #%d\n",++cat);        getnext(len);        cout<<endl;    }}


原创粉丝点击