AcWing 兔子与兔子

江枫思渺然 提交于 2019-11-27 04:10:59

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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!