hdu 3746(KMP的循环节问题)

题意:给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数。

例子:

abcabc 已经循环2次,添加数为0

abcac 没有循环2次,添加字符abcac。数目为5.

abcabcab 已经循环过2次,但第三次不完整,需要添加数为1.

分析:就是一个简单的KMP循环节问题,但我只能说杭电的数据太水了,一开始我写的一个明显有BUG的代码也能够AC,算了不说了!!

代码实现:

#include<iostream>
#include<cstring>
using namespace std;
char a[100001];
int next[100001];
int main()
{
    int T,len,i,j,nima;
    while(scanf("%d",&T)!=EOF)
    {
        getchar();
        while(T--)
        {
            scanf("%s",a+1);
            len=strlen(a+1);
            i=1;j=0;next[1]=0;
            while(i<=len)
            {
                if(j==0||a[i]==a[j])
                {
                    i++;j++;
                    next[i]=j;
                }
                else
                    j=next[j];
            }
            nima=(len+1)-next[len+1];
            if(len%nima==0&&len!=nima//这里要注意个是循环节的长度不能等于它自己本身就是len!=nima
               printf("%d\n",0);
            else
                printf("%d\n",nima-len%nima);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jiangjing/p/3019945.html