比较不同区间的子串是否相同,就转化为对应的哈希值是否相同
X1X2X3⋯Xn−1Xn 的字符串,映射公式 (X1×Pn−1+X2×Pn−2+⋯+Xn−1×P1+Xn×P0)modQ
通过巧妙设置P (131 或 13331) , Q 64的值,一般可以理解为不产生冲突
区间和公式 h[l,r]=h[r]−h[l−1]×Pr−l+1
左侧是高位,右侧是低位,h[l−1]进行左移
// 841.字符串哈希
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
typedef unsigned long long ULL;
const int N = 1e5 + 5, P = 131;
ULL h[N], p[N];
ULL query(int l, int r) {
return h[r] - h[l-1] * p[r-l+1];
}
int main () {
// 1. 处理输入
int n, m;
cin>>n>>m;
string x;
cin>>x;
// 2. p是进制,h是字符串和
p[0] = 1;
h[0] = 0;
// 3. 求字符串哥哥各个长度对应的值,放到h[]
for (int i = 0; i < n;i ++) {
// p[0] = 1, p[1] = P, p [2] = P ^ 2
p[i + 1] = p[i] * P;
// h[0] = 0, h[1] = h[0] * P + x[1]-----因为左侧是高位
h[i + 1] = h[i] * P + x[i];
}
// 4. 接着处理输入输出
while (m --) {
int l1, r1, l2, r2;
cin>>l1>>r1>>l2>>r2;
if (query(l1,r1) == query(l2,r2)) printf("Yes\n");
else printf("No\n");
}
return 0;
}