求串的最小循环节, 根据循环条件: n 为串长
那么 n - next[n]是n的约数
code:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1000010;
char T[N];
int Next[N], len1;
void getNext(){
len1 = strlen(T);
Next[0] = -1;
Next[1] = 0;
int i = 1, j = 0;
while(i < len1){
if(j == -1 || T[i] == T[j]) Next[++i] = ++j;
else j = Next[j];
}
}
int main(){
int t, mx;
while(scanf("%s", T), strcmp(T, ".")){
getNext();
mx = 1;
if(len1 % (len1 - Next[len1]) == 0) mx = max(mx, len1 / (len1 - Next[len1]));
printf("%d\n", mx);
}
return 0;
}