算法:字符串哈希
方法通过将字符串的每一位字符转化为一个P进制数(P一般取较大的素数,如131,1007等)取模或用$unsigned long long$自然溢出,再利用前缀和求区间和进行匹配
参考代码:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
int res;
string s;
int const P=131; //这里使用131进制数
ULL p[1000010],f[1000010]; //转化进制是用的数组和前缀和数组
int main(){
f[0]=0,p[0]=1;
cin>>s;
s=" "+s;
for (int i=1;i<=s.length();i++){
f[i]=f[i-1]*P+(s[i]-'a'+1); //将s转化为数
p[i]=p[i-1]*P; //和转化进制的方式相似
}
int n;
ULL res1,res2;
scanf("%d",&n);
int l1,l2,r1,r2;
for (int i=1;i<=n;i++){
scanf("%d %d %d %d",&l1,&r1,&l2,&r2);
res1=f[r1]-f[l1-1]*p[r1-l1+1];
res2=f[r2]-f[l2-1]*p[r2-l2+1];
if (res1==res2) printf("Yes\n");
else printf("No\n");
}
return 0;
}