「一本通 2.1 练习 1」Power Strings

「一本通 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_52536621/article/details/113807694
今日推荐