AcWing 兔子与兔子
Description
很久很久以前,森林里住着一群兔子。
有一天,兔子们想要研究自己的 DNA 序列。
我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母)。
然后我们每次选择两个区间,询问如果用两个区间里的 DNA 序列分别生产出来两只兔子,这两个兔子是否一模一样。
注意两个兔子一模一样只可能是他们的 DNA 序列一模一样。
Input
第一行输入一个 DNA 字符串 S。
第二行一个数字 m,表示 m 次询问。
接下来 m 行,每行四个数字 l1,r1,l2,r2,分别表示此次询问的两个区间,注意字符串的位置从1开始编号。
Output
对于每次询问,输出一行表示结果。
如果两只兔子完全相同输出 Yes,否则输出 No(注意大小写)。
Data Size
- 1≤length(S),m≤1000000
Sample Input
aabbaabb 3 1 3 5 7 1 3 6 8 1 2 1 2
Sample Output
Yes No Yes
题解:
- 字符串哈希。
- 模版题。用递推算出前i位的哈希值(1 <= i <= .size()),然后用前缀和方法得到想要的区间的哈希值。比较即可。
#include <iostream> #include <cstdio> #include <string> #define N 1000005 #define ull unsigned long long using namespace std; ull f[N], p[N] = {1}; int q; int read() { int x = 0; char c = getchar(); while(c < '0' || c > '9') c = getchar(); while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();} return x; } int main() { string t; cin >> t; for(int i = 0; i < t.size(); i++) f[i + 1] = f[i] * 131 + (t[i] - 'a' + 1), p[i + 1] = p[i] * 131; cin >> q; for(int i = 1; i <= q; i++) { int l1 = read(), r1 = read(); int l2 = read(), r2 = read(); ull v1 = f[r1] - f[l1 - 1] * p[r1 - l1 + 1]; ull v2 = f[r2] - f[l2 - 1] * p[r2 - l2 + 1]; printf(v1 == v2 ? "Yes\n" : "No\n"); } return 0; }