hdu3746

这题就是求循环节长度,要考虑一直循环的情况,做法就是KMP中求出next数组,附代码
#include <stdio.h>
#include <string.h>
char str1[100005];
int next[100005];
void get_next(int len1)
{
    int k=-1,j=0;
    next[0]=-1;
    while(j<len1)
    {
        if(k==-1||str1[k]==str1[j])
        {
            k++;j++;
            next[j]=k;
        }
        else
        k=next[k];
    }
}
int main()
{
    int n,len1,len2,i;
    while(scanf("%d",&n)!=EOF)
    {
        while(n--)
        {
            scanf("%s",str1);
            len1=strlen(str1);
            get_next(len1);
            //for(i=0;i<=len1;i++)
            //printf("%d ",next[i]);
            //printf("\n");
            len2=len1-next[len1];//求出真正循环节长度
            if(len1!=len2&&len1%len2==0)//当字符串为“aaaaaaaa”这类一直循环的情况时,输出0
            printf("0\n");
            else
            printf("%d\n",len2-next[len1]%len2);//为真正需要添加的长度,next[len1]%len2防止剩余部分含有循环节
        }
    }
    return 0;
}

你可能感兴趣的:(hdu3746)