您的位置:首页 > 其它

hdu 3746(KMP的循环节问题)

2013-04-14 10:48 225 查看
题意:给你一个字符串,要求将字符串的全部字符最少循环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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: