/*
bas[0] = 1;
for (int i = 1; i < maxn; i++) {
bas[i] = bas[i - 1] * Seed % Mod;
}
*/
ULL Seed_Pool[]={911,146527,19260817,91815541};
ULL Mod_Pool[]={29123,998244353,1000000009,4294967291ull};
ULL bas[maxn];
ULL Seed = Seed_Pool[2];
ULL Mod = Mod_Pool[3];
struct Hash_1D{
ULL sum[maxn];
void init(int seedIndex,int modIndex){
for (int i=1;i<=n;i++){
sum[i] = (sum[i-1]*Seed%Mod+a[i])%Mod;
}
}
ULL getHash(int l,int r){
return (sum[r]-sum[l-1]*bas[r-l+1]%Mod+Mod)%Mod;
}
}h;
顺手再存个kmp
struct KMP{
int nxt[maxn];
void init(int st){
nxt[st+1] = 0;
for (int i=2+st;i<=n;i++){
nxt[i] = nxt[i-1];
while (nxt[i] && a[i] != a[st+nxt[i]+1] )nxt[i] = nxt[st+nxt[i]];
nxt[i] += (a[i] == a[st+nxt[i]+1] && nxt[i] *2 +2 <= i-st);
}
}
}kmper;