「一本通 2.1 练习 1」Power Strings
思路:因为我们要求的是最短的循环节,故子串的长度一定是母串的因数,接着用哈希算出就行了。
注意
计算次方时要把初值赋值0。
代码
#include<bits/stdc++.h>
#define x 10000007
using namespace std;
string s;
long long hash[1000001],l,n,i,j,p[1000001];
long long hs(long long xx,long long y){
return (hash[y]-hash[xx-1]*p[y-xx+1]%x+x)%x;
}
int main(){
p[0]=1;
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
for(i=1;i<=1000000;i++)
p[i]=p[i-1]*31%x;
while(cin>>s&&s!="."){
l=s.size();
for(i=1;i<=l;i++)
hash[i]=(s[i-1]+hash[i-1]*31%x)%x;
for(i=1;i<=l;i++){
if(!(l%i)){
bool f=0;
for(j=i+1;j+i-1<=l;j+=i){
n=hs(j,j+i-1);
if(n!=hash[i]){
f=1;
break;
}
}
if(!f){
cout<<l/i<<endl;
break;
}
}
}
}
return 0;
}