HDU 3746 Cyclic Nacklace(KMP找循环节)

来源:互联网 发布:深圳it外包公司 编辑:程序博客网 时间:2024/05/01 02:58

这个题是给出一个字符串,问字符串后最少补多少个字母才能使这个字符串是一个周期串....周期最少是2...周期为1就不是周期串了...

根据next数组(虽然我的数组名是pre)的值可以看出周期串的性质...在最小周期之后的周期串,next数组的值是一直增大的...然后最小周期与i的关系是t=i-next[i]...然后我们看最后一个数字后面缺多少个凑成一个周期就好了...

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>using namespace std;char a[102000];int pre[100020];//前缀数组,pre[i]代表b数组中从第i个元素开始有pre[i]个元素和开头相等int m;void getpre(){    int i=0,j=-1;    pre[0]=-1;    while(i<m)    {        if(j==-1||a[i]==a[j])            pre[++i]=++j;        else            j=pre[j];    }}int main(){    int t;    cin>>t;    while(t--)    {        scanf("%s",a);        m=strlen(a);        getpre();        int len=m-pre[m];        if(m!=len&&m%len==0)            printf("0\n");        else        {            int ans=len-pre[m]%len;            printf("%d\n",ans);        }    }    return 0;}


0 0
原创粉丝点击