核心思想:
将字符串看成P进制数,P的经验值是131或13331,取这两个值的冲突概率低。
小技巧:
取模的数用2^64,这样直接用unsigned long long存储,溢出的结果就是取模的结果。

typedef unsigned long long ULL;
ULL h[N], p[N]; // h[k]存储字符串前k个字母的哈希值, p[k]存储 P^k mod 2^64// 初始化
p[0] = 1;
for (int i = 1; i <= n; i ++ )
{h[i] = h[i - 1] * P + str[i];p[i] = p[i - 1] * P;
}// 计算子串 str[l ~ r] 的哈希值
ULL get(int l, int r)
{return h[r] - h[l - 1] * p[r - l + 1];
}

模板题

《字符串哈希》

题目描述:

给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2,请你判断[l1,r1和[l2,r2这两个区间所包含的字符串子串是否完全相同。

字符串中只包含大小写英文字母和数字。

输入格式

第一行包含整数n和m,表示字符串长度和询问次数。

第二行包含一个长度为n的字符串,字符串中只包含大小写英文字母和数字。

接下来m行,每行包含四个整数l1,r1,l2,r2,表示一次询问所涉及的两个区间。

注意,字符串的位置从1开始编号。

输出格式

对于每个询问输出一个结果,如果两个字符串子串完全相同则输出“Yes”,否则输出“No”。

每个结果占一行。

数据范围

1≤n,m≤105

输入样例:

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

输出样例:

Yes
No
Yes

//快速判断两次字符串是不是相等
#include<bits/stdc++.h>
using namespace std ;
typedef unsigned long long ULL;
const int N=100010,P=131;//经验值 13331  这两个出错情况最少
int n,m;
char str[N];
ULL h[N],p[N];//h表示某一个前缀的哈希值,p是幂
ULL get(int l,int r) {return h[r]-h[l-1]*p[r-l+1];//返回某一段的哈希值
}
int main() {cin>>n>>m>>str+1;p[0]=1;//p的0次方为1 for(int i=1; i<=n; i++) {p[i]=p[i-1]*P;//求幂 h[i]=h[i-1]*P+str[i];//求前缀哈希值 }while(m--) {int l1,r1,l2,r2;cin>>l1>>r1>>l2>>r2;if(get(l1,r1)==get(l2,r2)) puts("Yes");// 如果哈希值相等 else puts("No");}return 0;
}

~~字符串哈希(数据结构)(附模板题AcWing 841 字符串哈希)相关推荐

  1. ~~一般哈希(数据结构)(附模板题AcWing 840 模拟散列表)

    (1) 拉链法 int h[N], e[N], ne[N], idx;// 向哈希表中插入一个数 void insert(int x) {int k = (x % N + N) % N;e[idx] ...

  2. ~~堆(数据结构)(附模板题 AcWing 838. 堆排序)

    模板 // h[N]存储堆中的值, h[1]是堆顶,x的左儿子是2x, 右儿子是2x + 1 // ph[k]存储第k个插入的点在堆中的位置 // hp[k]存储堆中下标是k的点是第几个插入的 int ...

  3. ~~队列(数据结构)(附模板题 AcWing 829. 模拟队列)

    1. 普通队列: // hh 表示队头,tt表示队尾 int q[N], hh = 0, tt = -1;// 向队尾插入一个数 q[ ++ tt] = x;// 从队头弹出一个数 hh ++ ;// ...

  4. ~~朴素dijkstra算法 (搜索与图论)(附模板题AcWing 849. Dijkstra求最短路 I)

    模板 时间复杂是 O(n2+m), n表示点数,m 表示边数 int g[N][N]; // 存储每条边 int dist[N]; // 存储1号点到每个点的最短距离 bool st[N]; // 存 ...

  5. 匈牙利算法——最大匹配问题详解(附模板题)

    基本概念转自  https://blog.csdn.net/dengheCSDN/article/details/77619308 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名. ...

  6. 二维前缀和(附模板题)

    模板 S[i, j] = 第i行j列格子左上部分所有元素的和 以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为: S[x2, y2] - S[x1 - 1, y2] - S[x2, ...

  7. AcWing 841. 字符串哈希

    题目描述 分析: 字符串 hash 小试牛刀 我们在之前模拟散列时,设置的哈希函数为将一个元素(element, e)输入哈希函数中,输出是一个整数,而那时的 e e e 为一个有范围的整数.现在我们 ...

  8. ~~二维差分(附模板题)

    模板 给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c: S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, ...

  9. AcWing 841. 字符串哈希(字符串Hash)

    题目连接 https://www.acwing.com/problem/content/843/ 思路 我们用一个数组a记录改字符串的前缀hash值,然后和前缀和类似的方法,不过注意的是,我们在计算区 ...

最新文章

  1. flutter 按钮_flutter好用的轮子推荐二-点赞按钮动画
  2. c# 利用反射获得某个类或者对象的所有属性
  3. 我看好嵌入式的未来!!!
  4. idea创建springboot项目出现的问题
  5. MongoDB BI Connector 实战指南
  6. 信息学奥赛一本通 1064:奥运奖牌计数 | OpenJudge NOI 1.5 07
  7. OSPF NSSA 默认路由的问题
  8. 万能打印之Delphi 2010实现(一)
  9. IO流实现csv文件到vcf文件生成
  10. pytz.exceptions.UnknownTimeZoneError解决办法
  11. Qt设置字体类型及添加字体文件
  12. 深度定制游戏引擎实现云服务器的非线性增长
  13. oracle 逗号连接表是相当于什么
  14. Excel 2010 VBA 入门 071 工作表事件之Worksheet_Change
  15. mysql neq_neq、eq的用法,thinkphp框架下的
  16. 内核分析-简单的操作系统内核源码解读
  17. 基于微信小程序的西餐外卖系统的设计与实现NodeJS-计算机毕业设计
  18. java基础--Java入门
  19. 一起去追寻那大漠孤烟
  20. 给li标签中的span设置属性margin-bottom不生效

热门文章

  1. With(ReadPast)就不会被阻塞吗?
  2. 【小程序】一个提醒休息的小程序,供大家娱乐
  3. JDK1.5新特性介绍
  4. Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.6 给自动检测组件命名...
  5. meterpreter持久后门
  6. (转)pycharm快捷键
  7. 40.leetcode17_letter_combinations_of_a_phone_number
  8. angular2.0中为什么初始化的时候就把全部路由下的模板文件加载出来的原因。
  9. 大型网站系统架构实践(一)从简单到复杂
  10. 微信支付开发(2) 扫码支付模式一