结论:数组的循环节等于长度减去数组长度的next值
即:num = len-next[len] num为最小循环节 len为数组长度
相关推导戳这里
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+7;
// 由此题得到一个重要的结论 循环节的长度 = len-next[len];len代表数组的长度
int Next[MAXN];
char s[MAXN];
void getNext(char str[])
{
int j = 0,k = -1;
Next[0] = -1;
int len = strlen(str);
while(j < len){
if(k == -1 || str[k] == str[j]){
//当前没有同 或者next可边长的时候
Next[++j] = ++k;
}
else{
k = Next[k];//回溯的过程
}
}
}
int main()
{
int t;
scanf("%d",&t);
getchar();
while(t--){
scanf("%s",s);
int len = strlen(s);
getNext(s);
//for(int i = 0;i <= len;i ++) printf("%d ",Next[i]);
int num = len-Next[len];
//printf("%d\n",num);
if(len%num == 0&&num != len) printf("0\n");
else printf("%d\n",num-len%num);
}
return 0;
}