题目链接:点击打开链接
题意描述:给定一个字符串,求使这个字符串是循环字符串至少需要添加多少个字符?要求循环至少两次
解题思路:kmp(next[]数组性质:点击打开链接)
根据next[]数组的性质我们可以得到一个字符串最小循环节为n-next[n],所以我们可以得出结论
if((n%(n-next[n])==0)&&(n/(n-next[n])>1))
printf("0\n");
else
printf("%d\n",n-next[n]-n%(n-next[n]));
代码:
#include <cstdio>
#include <cstring>
#define MAXN 100010
using namespace std;
void getNext(char* str,int len,int* next){
int i,j;
j=next[0]=-1;
i=0;
while(i<len){
while(j!=-1&&str[i]!=str[j]) j=next[j];
++i,++j; next[i]=j;
}
}
char st[MAXN];
int next[MAXN];
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%s",st);
n=strlen(st);
getNext(st,n,next);
if((n%(n-next[n])==0)&&(n/(n-next[n])>1))
printf("0\n");
else
printf("%d\n",n-next[n]-n%(n-next[n]));
}
return 0;
}