AcWing 841. 字符串哈希
原题链接
简单
C++ 代码
#include <iostream>
using namespace std;
const int N = 1e5 + 10,P = 131;
typedef unsigned long long ull; //一般用unsigned long long ,这样溢出的话就相当于取模了
ull p[N]; //存p的n次方,因为是p进制数,所以是乘p
ull h[N]; //前n个字符的hash值
char str[N];
ull get(int l,int r) //计算l~r的hash值,类似前缀和的公式
{
return h[r] - h[l-1] * p[r-l+1];
}
int main()
{
p[0] = 1; //初始化幂方为1
int n, m;
int l1, r1, l2, r2;
scanf("%d%d%s", &n, &m, str+1); //类似前缀和,下标从1开始
for(int i = 1; i <= n; ++i){ //初始化,类似于求前缀和
p[i] = p[i - 1] * P; //顺便计算p的n次方
h[i] = h[i - 1] * P + str[i]; //h[i]是前i个字符的hash值
}
while(m--){
scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
if(get(l1, r1) == get(l2, r2))
puts("Yes");
else
puts("No");
}
return 0;
}