字符串哈希
#include <iostream>
#include <algorithm>
using namespace std;
typedef unsigned long long ULL;
const int N = 100010,P = 131;
int n,m;
char str[N];
ULL h[N],p[N];
ULL get(int a,int b)
{
return h[b] - h[a - 1] * p[b - a + 1];
}
int main()
{
cin >> n >> m;
scanf("%s",str + 1);
p[0] = 1;
for(int i = 1;i <= n;i ++)
{
h[i] = h[i - 1] * P + str[i];//求字符串的哈希值,计算P进制的过程
p[i] = p[i - 1] * P; //预处理P的n次方
}
while(m --)
{
int l1,r1,l2,r2;
cin >> l1 >> r1 >> l2 >> r2;
if(get(l1,r1) == get(l2,r2)) puts("Yes");//如果哈希值相同 及字符串相同
else puts("No");
}
return 0;
}
关键 :区间和公式的理解(及get函数): ABCDE 与 ABC 的前三个字符值是一样,只差两位,
乘上P的二次方把 ABC 变为 ABC00,再用 ABCDE - ABC00 得到 DE 的哈希值。