这个问题考的是kmp算法中最小循环结点的问题
原问题去OJ看吧
http://acm.hdu.edu.cn/showproblem.php?pid=3746
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
#define MAXM 100100
int next1[MAXM],m;
char a[MAXM];
void get_next()
{
int i=0;
int j=-1;
next1[0]=-1;
int len=strlen(a);
while(i<len)
{
if(j==-1||a[i]==a[j])
{
j++;
i++;
next1[i]=j;
}
else
{
j=next1[j];
}
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",a);
get_next();
int len=strlen(a);
if(next1[len]==0)//如果最后一位没有前缀,需要另外一个那么长来组成串
{
cout<<len<<endl;
continue;//跳过本次循环进行下一次循环
}
int t=len-next1[len];//最小循环节
if(len%t==0)//
cout<<0<<endl;如果组成了循环节直接输出0
else
{
cout<<t-len%t<<endl;//补全循环节
}
}
return 0;
}