这个题就是利用kmp的next函数,求组成主串的最小重复子串的长度。
如果字符串下标从1开始的话,字符串长度len
(1)若len mod ( len - next[len] ) = 0 那么a[next[len]+1...len] 就是最小重复的子串
(2)若len mod ( len - next[len] ) !=0 那么最小重复子串为字符串本身
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=1000001;
int n;
int fail[maxn];
char a[maxn];
void kmp()
{
int i,j;
j=-1;
memset(fail,-1,sizeof(fail));
for(i=1;i<n;i++)
{
while(j>-1 && a[j+1]!=a[i]) j=fail[j];
if(a[j+1]==a[i]) j++;
fail[i]=j;
}
}
int main()
{
while(scanf("%s",&a))
{
if(a[0]=='.') break;
n=strlen(a);
kmp();
if(n%(n-1-fail[n-1])==0) cout<<n/(n-1-fail[n-1])<<endl;
else cout<<1<<endl;
}
return 0;
}