题意:给出一个字符串,问最少加几个字符可以时新的字符串拥有两个以上循环节
思路:只有当nxt[len]!=0时最后一个字符才可以再形成一个新的循环节,此时循环节的长度时len-nxt[len],分类讨论下就可以。最奇怪的一点是,如果直接用cin输入string时会wa,最后只能换成字符串的形式才可以a,这点是真的不知道为什么,但string会出现问题这点需要特别注意
代码:
#include <bits/stdc++.h>
#define x first
#define y second
#define mid (l + r >> 1)
#define lo (o << 1)
#define ro (lo | 1)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<double, int> pdi;
typedef vector<int> vi;
const int maxn = 1e5+10;
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 998244353;
struct tri{int x,y,z;};
int nxt[maxn];
char s[maxn];
int solve()
{
scanf("%s",s+1);
int len=strlen(s+1);
for(int i=2,j=0;i<=len;i++)
{
while(j&&s[i]!=s[j+1])j=nxt[j];
if(s[i]==s[j+1])j++;
nxt[i]=j;
}
int t=len-nxt[len];
if(len==t)return t;
else if(len%t)return t-len%t;
else return 0;
}
int main()
{
int _;scanf("%d",&_);
while(_--)
{
printf("%d\n",solve());
}
}