题解:找最短循环节,定义:nxt[i] 为 1-i的最长相同前后缀长度,循环节长度为n-nxt[n]
//#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#define reg register
using namespace std;
const int N=1e6+10;
char str[N];
int nxt[N],n;
int main(){
// freopen("poj2406.in","r",stdin);
while(1){
scanf("%s",str+1);
if(str[1] == '.')break;
n=strlen(str+1);
nxt[0]=-1;
for(reg int i=1,j;i<=n;i++){
j=nxt[i-1];
while(j!=-1 && str[i]!=str[j+1]) j=nxt[j];
nxt[i]=++j;
}
int t=n-nxt[n];
if(n%t==0)printf("%d\n",n/t);
else printf("1\n");
}
return 0;
}
Kmp 模板
```