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