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;
} 
全部评论

相关推荐

缒梦&独舞:这家公司是这样的,去年给我实习offer了,不过也是面着玩儿的,他周六还要去做公益志愿活动
点赞 评论 收藏
分享
那一天的Java_J...:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务