您的位置:首页 > 其它

HDU 3746 Cyclic Nacklace(KMP找循环节)

2015-02-21 20:41 337 查看
这个题是给出一个字符串,问字符串后最少补多少个字母才能使这个字符串是一个周期串....周期最少是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: