基础算法 841.字符串哈希
也叫字符串前缀哈希法。
例如字符串“ABCDEFGH”。
用h[0], h[1], h[2]......h[n]分别表示前n个字符的子串的哈希值。
将字符串看作为p进制的数字,再将其mod一个数,得到哈希值。
经验上来说,p一般为131,或13331。
mod的数为2^64。unsigned long long如果溢出,就相当于对它取模。
#include<iostream>
using namespace std;
typedef unsigned long long ULL;
const int N = 100010, p = 131;
ULL h[N], n[N];
ULL get(int l, int r){
return h[r] - h[l - 1] * n[r - l + 1];
}
int main(){
char str[N];
int len, m;
scanf("%d%d%s",&len, &m, str + 1);
n[0] = 1;
for(int i = 1; i <= len; i ++ ){
n[i] = n[i - 1] * p;
h[i] = h[i - 1] * p + str[i];
}
while(m -- ){
int l1, r1, l2, r2;
scanf("%d%d%d%d",&l1, &r1, &l2, &r2);
if(get(l1, r1) == get(l2, r2)) puts("Yes");
else puts("No");
}
return 0;
}

浙公网安备 33010602011771号