思路:对于每一个串进行KMP找最长前后缀相同长度
所以n-p[n]就是最短字串
code
#include<bits/stdc++.h>
using namespace std;
char c[1000100];
int p[1000100];
void work(){
int len=strlen(c);
for(int i=1,j=0;i<len;i++){
while(j>0&&c[i]!=c[j]) j=p[j];
if(c[i]==c[j]) j++;
p[i+1]=j;
}
}
int main(){
scanf("%s",c);
while(c[0]!='.'){
memset(p,0,sizeof(p));
work();
int n=strlen(c);
if(n%(n-p[n])==0) printf("%d\n",n/(n-p[n]));
else printf("1\n");
cin>>c;
}
}