这篇博客解释的很清楚,比我讲的要好得多
有个结论就是串的长度size能整除size - next[size],这个串就存在循环节,循环节的长度就是size - next[size]
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
char a[1000005];
int nextval[1000005];
int main()
{
while (scanf("%s", a) && a[0] != '.')
{
int sizea = strlen(a);
int i = 0, j = -1;
nextval[0] = -1;
while (i < sizea)
{
if (j == -1 || a[i] == a[j])
{
i++, j++;
nextval[i] = j;
}
else
{
j = nextval[j];
}
}
if (sizea % (sizea - nextval[sizea]) == 0)
{
printf("%d\n", sizea / (sizea - nextval[sizea]));
}
else
{
printf("1\n");
}
}
return 0;
}