哎哟喂,这类题真的不想再做了。都是KMP求周期,再练就没有意思了。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAX 101000
int next[MAX];
char t[MAX];//t是待判断的子串
void CalcNext(int length) //t串的长度
{
int i,j;
i=0;
next[0]=-1;
j=-1;
while(i<length)
{
if(j==-1||t[i]==t[j]){i++;j++;next[i]=j;}
else{j=next[j];}
}
}
int main()
{
int i,j;
int T;
scanf("%d",&T);
getchar();
while(T)
{
gets(t);
int n=strlen(t);
CalcNext(n);
if(n%(n-next[n])==0&&next[n]!=0)
printf("%d\n",0);
else
{
int temp=n-next[n];
//cout<<temp<<endl;
printf("%d\n",temp-(n-n/temp*temp));
}
T--;
}
return 0;
}