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] len−next[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 (len−next[i])==0 ,此字符串的最小周期就为 l e n / ( l e n − n e x t [ i ] ) len/(len-next[i]) len/(len−next[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
*/