# 题意
给定一个字符串,n个询问
每个询问包含两个区间,问字符串中这两个区间的字符是否相等
# 题解
即求出从头到每个下标的hash值
每次询问 l,r 时通过相减求得即可
预处理数组p记录p的各个次方
1 #include <bits/stdc++.h> 2 #define ull unsigned long long 3 using namespace std; 4 const int N=1e6+10,P=131; 5 char str[N]; 6 int m; 7 ull h[N],p[N]; 8 int main(){ 9 scanf("%s",str+1); 10 cin>>m; 11 p[0]=1; 12 int n=strlen(str+1); 13 for(int i=1;i<=n;i++){ 14 h[i]=h[i-1]*P+(str[i]-'a'+1); 15 p[i]=p[i-1]*P; 16 } 17 while(m--){ 18 int l1,r1,l2,r2; 19 cin>>l1>>r1>>l2>>r2; 20 if(h[r1] - (h[l1-1] * p[r1-l1+1]) == h[r2] - (h[l2-1] * p[r2-l2+1])) 21 cout<<"Yes"<<endl; 22 else 23 cout<<"No"<<endl; 24 } 25 }