题目:

输入样例:
8 3
aabbaabb
1 3 5 7
1 3 6 8
1 2 1 2
输出样例:
Yes
No
Yes
字符串哈希要点:
1.预处理哈希数组 (p[i]存储p进制数的i次方,公式里用 h[i]数组存储从第一个字母到第i个字母的哈希值)
2.区间的公式

预处理:
for(int i=1;i<=n;i++){ //预处理
p[i] = p[i-1] * P;
h[i] = h[i-1] *P +s[i];
}

代码:
#include<bits/stdc++.h>
typedef unsigned long long ULL;
using namespace std;
const int null = 0x3f3f3f3f;
const int N = 100003;
const int P = 131;
int n;
char s[N];
int m;
ULL p[N]; //p[i]存的是p的i次方
ULL h[N]; //h[i]从1到i的哈希值
int check(int l,int r, int ll, int rr){
if(h[r] - h[l-1] * p[r-l+1] == h[rr] - h[ll-1] * p[rr-ll+1]) return 1;
return 0;
}
int main(){
cin >> n >> m ;
cin >> s+1;
h[0] = 0;
p[0] = 1;
for(int i=1;i<=n;i++){ //预处理
p[i] = p[i-1] * P;
h[i] = h[i-1] *P +s[i];
}
int l,r,ll,rr;
while(m--){
cin >> l >> r >> ll >> rr;
if(check(l,r,ll,rr)) cout << "Yes";
else cout << "No" ;
puts("") ;
}
return 0;
}
相关链接:
3538

被折叠的 条评论
为什么被折叠?



