AcWing 兔子与兔子

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;
}

转载于:https://www.cnblogs.com/BigYellowDog/p/11343489.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值