分析:
若字符串第x位 有 len%(len-Next[x])==0 && Next[x]!=0 那么 len - Next[x] 是字符串的一个循环节。
因为要求最小循环节,x一开始从 len开始往前找。 当前第x位不符合就沿着Next数组往前找。
代码如下:
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100;
char s[maxn];
int Next[maxn];
bool isFirst;
void get_next(){
Next[0] = Next[1] = 0;
int j = 0;
for (int i=1; i<strlen(s); i++) {
while (j && s[j]!=s[i]) j = Next[j];
if (s[j]==s[i]) j++;
Next[i+1] = j;
}
}
int main(){
int N;
int len,x;
isFirst = 1;
scanf("%d",&N);
while (N--){
scanf("%s",s);
get_next();
len = x = strlen(s);
if (!isFirst) printf("\n");
isFirst = 0;
while (x && len%(len-Next[x])!=0) x = Next[x];
printf("%d\n",len-Next[x]);
}
return 0;
}