题意
给你一个串A,问你需要再补充多少个字符,才能让A字符是一个具有循环节的字符串
思路
定理:假设S的长度为len,则S存在最小循环节,循环节的长度L为len-next[len],子串为S[0…len-next[len]-1]。
(1)如果len可以被len - next[len]整除,则表明字符串S可以完全由循环节循环组成,循环周期T=len/L。
(2)如果不能,说明还需要再添加几个字母才能补全。需要补的个数是循环个数L-len%L=L-(len-L)%L=L-next[len]%L,L=len-next[len]。
https://www.cnblogs.com/chenxiwenruo/p/3546457.html
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=1e5+10;
char str[MAXN];
int len,snext[MAXN];
void getnext()
{
int j=0;
int k=snext[0]=-1;
while(j<len)
{
if(k==-1||str[j]==str[k])
{
j++;k++;
snext[j]=k;
}
else k=snext[k];
}
}
int main()
{
int T;cin>>T;
while(T--)
{
scanf("%s",str);
len=strlen(str);
getnext();
int t1=len-snext[len];
if(len%t1==0&&t1!=len)
puts("0");
else printf("%d\n",t1-len%t1);
}
return 0;
}