AcWing:138. 兔子与兔子(Hash)

很久很久以前,森林里住着一群兔子。

有一天,兔子们想要研究自己的 DNA 序列。

我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母)。

然后我们每次选择两个区间,询问如果用两个区间里的 DNA 序列分别生产出来两只兔子,这两个兔子是否一模一样。

注意两个兔子一模一样只可能是他们的 DNA 序列一模一样。

输入格式

第一行输入一个 DNA 字符串 S。

第二行一个数字 m,表示 m 次询问。

接下来 m 行,每行四个数字 l1,r1,l2,r2l1,r1,l2,r2,分别表示此次询问的两个区间,注意字符串的位置从1开始编号。

输出格式

对于每次询问,输出一行表示结果。

如果两只兔子完全相同输出 Yes,否则输出 No(注意大小写)。

数据范围

1≤length(S),m≤10000001≤length(S),m≤1000000

输入样例:

aabbaabb
3
1 3 5 7
1 3 6 8
1 2 1 2

输出样例:

Yes
No
Yes

算法:Hash(字符串)

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

typedef long long ll;

const int maxn = 1e6+7;
const int P = 13;       //自己选择一个固定的P进制数

char str[maxn];
ll f[maxn];
ll p[maxn];

int main() {
    scanf("%s", str + 1);
    p[0] = 1;
    int len = strlen(str + 1);
    for(int i = 1; i < len; i++) {
        f[i] = f[i - 1] * P + str[i] - ‘a‘ + 1;
        p[i] = p[i - 1] * P;
    }
    int T;
    scanf("%d", &T);
    while(T--) {
        int l1, r1, l2, r2;
        scanf("%d %d %d %d", &l1, &r1, &l2, &r2);
        if(f[r1] - f[l1 - 1] * p[r1 - l1 + 1] == f[r2] - f[l2 - 1] * p[r2 - l2 + 1]) {
            printf("Yes\n");
        } else {
            printf("No\n");
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/buhuiflydepig/p/11291439.html

时间: 2024-10-07 18:42:21

AcWing:138. 兔子与兔子(Hash)的相关文章

兔子生兔子函数递归

namespace 兔子生兔子函数递归{    class Program    {        static void Main(string[] args)        {            Console.WriteLine("请输入你想知道兔子哪个月的数量:");            int m = Convert.ToInt32(Console.ReadLine());            int sum = new Program().tuzi(m);  //定

[转][RabbitMQ+Python入门经典] 兔子和兔子窝

http://blog.csdn.net/linvo/article/details/5750987 RabbitMQ作为一个工业级的消息队列服务器,在其客户端手册列表的Python段当中推荐了一篇blog,作为RabbitMQ+Python的入门手册再合适不过了.不过,正如其标题Rabbit and Warrens(兔 子和养兔场)一样,这篇英文写的相当俏皮,以至于对于我等非英文读者来说不像一般的技术文档那么好懂,所以,翻译一下吧.翻译过了,希望其他人可以少用一 些时间.翻译水平有限,不可能像

兔子与兔子(字符串Hash)

目录 描述 输入格式 输出格式 样例输入 样例输出 Solution Code 描述 很久很久以前,森林里住着一群兔子.有一天,兔子们想要研究自己的 DNA 序列.我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母),然后我们每次选择两个区间,询问如果用两个区间里的 DNA 序列分别生产出来两只兔子,这两个兔子是否一模一样.注意两个兔子一模一样只可能是他们的 DNA 序列一模一样. 输入格式 第一行一个 DNA 字符串 S. 接下来一个数字 m

5.16 兔子生兔子,日期时间练习

namespace ConsoleApplication8 { class Program { static void Main(string[] args) { #region // //有一对幼兔,幼兔一个月后长成小兔,小兔一个月后长成成兔.并生下一对幼兔, //// 问几年后,有多少对幼兔,多少对小兔,多少对成兔,兔子总数是多少? // // 成兔每月生一对幼兔. // Console.WriteLine("请输入月份"); // int MM = int.Parse(Conso

算法:兔子生兔子

古典问题:有一只大兔子,大兔子每个月生一只小兔子,第二个月小兔子会长成大兔子,假如兔子都不死,问第N个月的兔子总数为多少? 解法一.循环 1 public long sumRubbit1(int n){ 2 long total = 0; //兔子总数 3 int big = 1; //大兔子总数 4 int middle = 0; //中兔子总数 5 int little = 0; //小兔子总数 6 if(n==1){ 7 total = big; 8 }else if(n==2){ 9 l

兔子生兔子问题

一对兔子,从出生后的第3个月起每个月都生1对,小兔子长到第3个月后每个月又生1对兔子,假如兔子都不死,某个月的兔子总数是多少分析:每个月兔子总数1,1,2,3,5,8,13,21,34,55... n1=1;//第一个月n2=1;//第二个月 n1=n1+n2;//第三个月 n2=n1+n2;//第四个月 f(n):第n个月 兔子总量 f(n)=f(n-1)+f(n-2) f(5)=f(4)+f(3) f(4):3 f(3):2 f(2):1 f(1):1 <script> function

题四:一对兔子生兔子,给个月份算有几只兔子

这个用递归就行,兔子就是个类,他们有自己的行为,这种思路可以帮助我们给兔子建立模型. 写法一: /** * 有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月又生一对兔子,假如兔子都不死,问每个月的兔子总数多少? */ public class Test4 { public static void main(String[] args) { RabbitPair rabbitPair = new RabbitPair(6); System.out.println(rabbitP

【哈希】兔子与兔子

题目描述 很久很久以前,森林里住着一群兔子.有一天,兔子们想要研究自己的 DNA 序列.我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母),然后我们每次选择两个区间,询问如果用两个区间里的 DNA 序列分别生产出来两只兔子,这两个兔子是否一模一样.注意两个兔子一模一样只可能是他们的 DNA 序列一模一样. 输入 第一行一个 DNA 字符串 S.接下来一个数字 m,表示 m 次询问.接下来 m 行,每行四个数字 l1, r1, l2, r2,分

兔子生兔子问题(斐波那契数列)

一道经典的算法问题. 题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子.假如兔子都不死,要求输出一年内兔子的数量是多少. 1 1 2 3 5 8…… 代码如下: //兔子问题(斐波那契) package com.hxzy.homework; public class HomeWork05 {     public static void main(String[] args) {         // TODO Auto-generated meth