HDU - 3746 kmp

kmp求让一个字符串有两个循环节,所需要加的最少的字符.
n-next【n】就是循环节.
如果n能整除循环节,说明n是循环的,循环的次数就是除法所得的商

#include<cstdio>
#include<cstring>
const int maxn=1000005;
int next[maxn],f[maxn];
char a[maxn],b[maxn];
int main(){
   
	int t;
	scanf("%d",&t);
	while(t--){
   
		scanf("%s",a+1);
		int n=strlen(a+1);
		next[1]=0;
		for(int i=2,j=0;i<=n;i++){
   
			while(j>0&&a[i]!=a[j+1])	j=next[j];
			if(a[i]==a[j+1])	j++;
			next[i]=j;
		}
		if(next[n]==0)	printf("%d\n",n);
		else{
   
			int t=n-next[n];
	        if(n%t==0)printf("0\n");
	        else{
   
	            printf("%d\n",t-n%t);
	        }
		}
	}
	return 0;
} 
全部评论

相关推荐

11-24 11:23
门头沟学院 C++
点赞 评论 收藏
分享
贺兰星辰:不要漏个人信息,除了简历模板不太好以外你这个个人简介是不是太夸大了...
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务