题目链接:https://vjudge.net/problem/HDU-3746
这道题利用了KMP里next数组的性质
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=100000+10;
char b[N];
int next0[N];
void find_next()
{
int len=strlen(b);
int k=-1;
next0[0]=-1;
int j=0;
while(j<len) //多求一位
{
if(k==-1||b[j]==b[k])
{
j++;
k++;
next0[j]=k;
}
else
{
k=next0[k];
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",b);
find_next();
int len=strlen(b);
if(next0[len]==0) //最长公共前缀长度
{
printf("%d\n",len);
continue;
}
int t=len-next0[len];
if(len%t==0) printf("0\n");
else printf("%d\n",t-len%t);
}
return 0;
}