hash的模板题,但要用scanf否则超时。也可以用KMP算法来做
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1e6+10;
const int seed=131;
typedef long long ll;
ll _base[maxn],_hash[maxn];
int len;
char s[maxn];
ll str_hash(int l,int r){
return _hash[r]-_hash[l-1]*_base[r-l+1];
}
bool check(int x){
ll num=str_hash(0,x-1);
for(int i=x;i+x<=len;i+=x){
if(num!=str_hash(i,i+x-1)){
return false;
}
}
return true;
}
int main()
{
_base[0]=1;
for(int i=1;i<maxn;i++) _base[i]=_base[i-1]*seed;
while(scanf("%s",s)&&*s!='.'){
len=strlen(s);
_hash[0]=s[0]-'a'+1;
for(int i=1;i<len;i++) _hash[i]=_hash[i-1]*seed+(s[i]-'a'+1);
for(int i=1;i<=len;i++){
if(len%i!=0)
continue;
if(check(i)){
printf("%d\n",len/i);
break;
}
}
}
return 0;
}