KMP next数组用于求最小循环节:
先说结论:
如果对于next数组中的 i, 符合 i % ( i - next[i] ) == 0 && next[i] != 0 , 则说明字符串循环,而且
循环节长度为: i - next[i]
循环次数为: i / ( i - next[i] )
否则的话不循环代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 100100
#define LL long long
using namespace std;
char str[MAXN];
int next[MAXN];
void get_next(char p[]) {
int len = strlen(p);
int i = 0, j = 0;
next[1] = 0;
for(int i=2; i<=len; ++i) {
while(j>0 && str[j+1]!=str[i])
j = next[j];
if(str[j+1] == str[i])
++j;
next[i] = j;
}
}
int main(void) {
int T;
scanf("%d", &T);
while(T--) {
scanf("%s", str+1);
get_next(str+1);
int len = strlen(str+1);
/*
for(int i=1; i<=len; ++i) {
printf("%d\t", next[i]);
}
*/
int ans = len - next[len];
if(ans == len)
printf("%d\n", len);
else if(len % ans == 0)
printf("0\n");
else printf("%d\n", ans - len%ans);
}
return 0;
}