hdu3746 利用KMP找循环节

来源:互联网 发布:sqlserver连接oracle 编辑:程序博客网 时间:2024/06/05 21:02

    题意:在一个串的后面添加若干字符,使其成为一个循环串。

/*利用next数组求循环节结论:当且仅当len%(len-next[len-1])==0时,s[next[len-1]~len-1]为最小循环节*/#include<stdio.h>const int N=100005;char s[N];int next[N],len;void getnext(){    int i,j;    next[0]=0;    for(i=1,j=0;s[i];i++)    {        while(j>0&&s[i]!=s[j])            j=next[j-1];        if(s[i]==s[j])            j++;        next[i]=j;    }    len=i;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%s",s);        getnext();        int c=len-next[len-1];        if(len%c==0)        {            if(len/c>1)                printf("0\n");            else                printf("%d\n",len);        }        else            printf("%d\n",c-(len-len/c*c));    }    return 0;}


 

原创粉丝点击