博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
兔子与兔子(字符串Hash)
阅读量:5107 次
发布时间:2019-06-13

本文共 1548 字,大约阅读时间需要 5 分钟。

目录

描述

很久很久以前,森林里住着一群兔子。有一天,兔子们想要研究自己的 DNA 序列。我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母),然后我们每次选择两个区间,询问如果用两个区间里的 DNA 序列分别生产出来两只兔子,这两个兔子是否一模一样。注意两个兔子一模一样只可能是他们的 DNA 序列一模一样。

输入格式

第一行一个 DNA 字符串 S。

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

输出格式

对于每次询问,输出一行表示结果。如果两只兔子完全相同输出 Yes,否则输出 No(注意大小写)

样例输入

aabbaabb

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

样例输出

Yes

No
Yes

Solution

有趣的Hash呀!

可以维护整个字符串所有前缀的hash值F[i],然后计算子串(づ ●─● )づ


Code

#include 
#include
#include
#include
#include
using namespace std;const int N = 1000007, P = 131;char s[N];int n, m, l1, l2, r1, r2, len1, len2;unsigned long long f[N], p[N]; inline int read(){ int ans = 0, f = 1; char ch = getchar(); for(; ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') f = 0; for(; ch >= '0' && ch <= '9'; ch = getchar()) ans = (ans << 3) + (ans << 1) + ch - 48; return f? ans: -ans;}int main(){ scanf("%s", s + 1); n = strlen(s + 1); p[0] = 1; for (int i = 1; i <= n; ++i){ f[i] = f[i - 1] * P + s[i] - 'a' + 1; p[i] = p[i - 1] * P; } m = read(); while (m--){ l1 = read(), r1 = read(), l2 = read(), r2 = read(); len1 = r1 - l1 + 1, len2 = r2 - l2 + 1; if (f[r1] - f[l1 - 1] * p[len1] == f[r2] - f[l2 - 1] * p[len2]) puts("Yes"); else puts("No"); } return 0;}

转载于:https://www.cnblogs.com/DorkyTAT/p/11160653.html

你可能感兴趣的文章
证件照(1寸2寸)拍摄处理知识汇总
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>
设计模式之装饰者模式
查看>>
一道不知道哪里来的容斥题
查看>>
Blender Python UV 学习
查看>>
window添加右键菜单
查看>>
入手腾龙SP AF90mm MACRO
查看>>
Window7上搭建symfony开发环境(PEAR)
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
一些方便系统诊断的bash函数
查看>>
jquery中ajax返回值无法传递到上层函数
查看>>
css3之transform-origin
查看>>
[转]JavaScript快速检测浏览器对CSS3特性的支持
查看>>
Master选举原理
查看>>