字符串的长度为len
最小循环节的长度L=len-next[len]
需要补齐的字符个数r=L-len%L
这个题没啥大的问题,就是输入很奇怪,如果用cin,getline()会错,用scanf("%s",s)就对了
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
#include<queue>
#include<map>
using namespace std;
int Next[100005],n;//注意Next数组的大小
char s[100005],a[1000005];
void getNext()
{
int i=0,j=-1;
Next[0]=-1;
while(i<=n)
{
if(j==-1||s[i]==s[j])
{
i++;
j++;
if(s[i]==s[j])
Next[i]=Next[j];
else Next[i]=j;
}
else j=Next[j];
}
}
int main()
{
int C,i,j,cnt,m,L,len;
cin>>C;
cin.get();
while(C--)
{
scanf("%s",s);//不能用cin.getline(),不知道为啥
n=strlen(s);
getNext();
L=n-Next[n];
if(n%L==0&&n/L>1)printf("0\n");//全部由循环节组成,且循环两次以上
else
{
cnt=L-(n%L);
printf("%d\n",cnt);
}
}
return 0;
}