求助大佬
查看原帖
求助大佬
1380676
He_XY楼主2025/7/28 17:45

字符串哈希到底应该怎么写?我没学过这个算法,听同学聊天讲到的,自己啥也不知道的情况下写了一个板子,长这样……为什么我写着写着代码里出现了逆元啊?!(能过,但我想请教一下各位大佬,正常的字符串哈希应该怎么写)

//CF7D - by He_XY
#include<bits/stdc++.h>
#define int long long
#pragma GCC optimize(3,"Ofast","inline","-funroll-loops")
using namespace std;
const int MOD=1e9+7;
const int maxn=5000005;
int prf[maxn],suf[maxn];
int f[maxn];
int pw(int a,int b){
	int res=1;
	while(b){
		if(b&1) res=res*a%MOD;
		a=a*a%MOD;
		b>>=1;
	}
	return res;
}
int t[maxn];
int inv[maxn];
void solve(){
	string s=" ";
	int n=0;
	char c;
	while((c=getchar())!=EOF){
		s+=c; ++n;
	}
	// scanf("%s",&s);
	int base=83;
	t[0]=1;
	for(int i=1;i<=n;++i){
		t[i]=t[i-1]*base%MOD;
		prf[i]=t[i]*(s[i]-'0')%MOD+prf[i-1];
		prf[i]%=MOD;
	}
	
	for(int i=n;i>=1;--i){
		suf[i]=t[n-i+1]*(s[i]-'0')%MOD+suf[i+1]%MOD;
		suf[i]%=MOD;
	}
	inv[n]=pw(t[n],MOD-2);
	for(int i=n-1;i>=0;--i){
		inv[i]=inv[i+1]*base%MOD;
	}
	
	int ans=1;
	f[1]=1;
	for(int i=2;i<=n;++i){
		int l=prf[i>>1],r=((suf[i-i/2+1]-suf[i+1])%MOD+MOD)%MOD;
		r=r*inv[n-i]%MOD;
		if(l==r){
			f[i]=f[i>>1]+1;
			ans+=f[i];
		}
	}
	cout<<ans<<endl;
}

int32_t main(){
	solve();
	return 0;
}
2025/7/28 17:45
加载中...