HDU 1358 Period [kmp]

来源:互联网 发布:sql server2012r2下载 编辑:程序博客网 时间:2024/06/08 12:55

题意:给你一个字符串,求所有前缀循环次数大于等于2次的前缀

题解:对next数组的理解。next数组就是求当前位置的后缀与从头开始的前缀匹配程度,设j=i-next[i],若i%j==0说明肯定有循环节,且循环长度为j,次数为i/j。

AC代码:

#include<stdio.h>#include<string.h>#define N 1000005char a[N],b[N];int next[N];void get_next(int l){    next[0]=-1;    int i=1,j=0;    while(i<l)    {        if(j==-1||b[i]==b[j])            next[++i]=++j;        else j=next[j];    }}int main(){     int n;    int e=1;    while(~scanf("%d",&n))    {        if(n==0)break;;        scanf("%s",b);        int l=strlen(b);        get_next(l);        printf("Test case #%d\n",e++);        for(int i=1;i<=l;i++)            if(next[i]!=0&&i%(i-next[i])==0)                printf("%d %d\n",i,i/(i-next[i]));        printf("\n");    }}


原创粉丝点击