很久没写过KMP了,熟悉一下next数组的写法。
next[len]-len的差即是循环部分的长度。
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn= 100000+5;
char t[maxn];
int next[maxn],len;
void getnext()
{
int j=0,k=-1;
next[0]=-1;
while(j<len)
{
if(t[j]==t[k]||k==-1)
next[++j]=++k;
else k=next[k];
}
}
int main()
{
int T;
scanf("%d",&T);
getchar();
while(T--)
{
scanf("%s",t);
len=strlen(t);
getnext();
int length=len-next[len];
if(len%length==0&&len!=length) printf("0\n");
else printf("%d\n",length-len%length);
}
return 0;
}