字符串hash

#include<iostream>
#include<cstdio>
#include<cstring> 
#define ll long long
#define mod 998244353
#define maxn 100010
#define jin 26//进制
using namespace std;

int l,r;
int h[maxn];//前缀的hash的值 abcdacc ->1234133
int mi[maxn];//进制的i次方
char s[maxn];

//函数封装不容易出错
int ad(int x,int y){//+
    return (x+y)%mod;
}

int sub(int x,int y){//-
    return (x-y+mod)%mod;
}

int mul(int x,int y){//*
    return (ll)x*y%mod;
}

int main(){
    cin>>s+1;//从第1位开始输入字符串
    int n=strlen(s+1);
    cin>>l>>r;
    mi[0]=1;
    for(int i=1;i<=n;i++){
        // mi[i]=((ll)mi[i-1]*jin)%mod;//写法一
        mi[i]=mul(mi[i-1],s[i]-'a');//写法二
    }
    for(int i=1;i<=n;i++){
        // h[i]=((ll)h[i-1]*jin+(s[i]-'a'))%mod;
        h[i]=ad(mul(h[l-1],jin),s[i]-'a');
    }
    // int hsh=((h[r]-h[l-1]*mi[r-l+1])%mod+mod)%mod;//注意取模,+mod保证结果为正数
    int hsh=sub(h[r],mul(h[l-1],mi[r-l+1]));
    cout<<hsh<<endl;//随便输出的(雾
    return 0;
}
原文地址:https://www.cnblogs.com/DReamLion/p/14391446.html