HDU 3746 Cyclic Nacklace【KMP】

Cyclic Nacklace


传送门。

题意:

  • T组数据
  • 给一个串串,求最少加入多少珠子(只能在串串首尾加),将这个串串首尾相接后,是一个有循环的串串。

思路:

  • n e x t [ ] next[ ] next[] 数组的应用。
  • n e x t [ ] next[] next[]有一个性质: l e n − n e x t [ i ] len-next[i] lennext[i]为此字符串的最小循环节( i i i 为字符串的结尾),另外如果 l e n len len M o d Mod Mod ( l e n − n e x t [ i ] ) = = 0 (len-next[i])==0 (lennext[i])==0 ,此字符串的最小周期就为 l e n / ( l e n − n e x t [ i ] ) len/(len-next[i]) len/(lennext[i]) ;(引用博客)

#include<cstdio>
#include<cstring>
const int Mn=1e5+17;

int next[Mn];
void preKMP(char x[],int m,int kmpNext[]){
	int i=0,j=-1;kmpNext[0]=-1;
	while(i<m){
		while(-1!=j&&x[i]!=x[j]) j=kmpNext[j];
		if(x[++i]==x[++j])kmpNext[j]=kmpNext[j];
		else kmpNext[i]=j;
	}
	// for(int i=0;i<m;++i)printf("%c  ",x[i]);printf("\n");
	// for(int i=0;i<=m;++i)printf("%2d ",kmpNext[i]);printf("\n");
} 

char a[Mn];
int main(){
	int T;scanf("%d",&T);
	while(T--){
		scanf("%s",a);
		int len=strlen(a);
		preKMP(a,len,next);
		int cyclic=len-next[len];	//cyclic为循环节长度
		// if(len%cyclic==0) num=len/cyclic;	//串串中有几个循环,本题不用
		if(!next[len]) printf("%d\n",len);
		else if(!(len%cyclic)) puts("0");
		else printf("%d\n",cyclic-len%cyclic);
	}
	return	0;
}
/*

Sample Input
3
aaa
abca
abcde
 

Sample Output
0
2
5

*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值