做多了KMP感觉这东西其实很简单,核心就是利用好next数组,这道题也是这样,除了理解错题意wa两遍之外还是挺顺利的
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
using namespace std;
//char a[1000005];
char b[100005];
int ne[100005];
void findnext()
{
int i = 0, j = -1;
int len = strlen(b);
ne[0] = -1;
while(i < len)
{
if(j == -1 || b[i] == b[j])
ne[++i] = ++j;
else j = ne[j];
}
}
int main()
{
int t;
scanf("%d",&t);
while(t --)
{
scanf("%s",b);
findnext();
int n = strlen(b);
int len = n - ne[n];//单个循环节长度
if(n % len == 0 && n / len > 1)//构成完整循环并且循环节大于等于2
printf("0\n");
else
// printf("%d\n",len - ne[n]);//之前wa的原因
printf("%d\n",len - ne[n] % len);//输出不够一个循环节的数目
}
return 0;
}