题目:
题解:
最小循环节=长度-末位失配
条件:1、长度可以整除末位失配 2、末位失配的长度小于长度的二分之一
其实可以发现1包含2,因为如果循环节大于长度的一半,也不可能整除
代码:
#include <cstdio>
#include <cstring>
using namespace std;
char s[1000005];int t[1000005],n;
void sp()
{
t[0]=-1;
for (int i=0;i<n;i++)
{
int j=t[i];
while (j!=-1 && s[i]!=s[j]) j=t[j];
t[i+1]=++j;
}
}
int main()
{
while (scanf("%s",s) && s[0]!='.')
{
n=strlen(s); sp();
if (n%(n-t[n])==0) printf("%d\n",n/(n-t[n]));else printf("1\n");
}
}