[AcWing]841. 字符串哈希(C++实现)字符串哈希模板题
1. 题目
2. 读题(需要重点注意的东西)
思路:要快速判断两个字符串是否相等的时候,可以用字符串哈希;相应的题目可以直接搜哈希的题目
核心思想:用p进制的角度,将字符串看成是一个数字
然后可以用该前缀哈希值得到所有子串的哈希值
比较难以理解的地方在于P的含义与公式的理解以及代码中的预处理p和h数组,其解释详见 3.解法 中的可能出现的问题
3. 解法
---------------------------------------------------解法---------------------------------------------------
#include <iostream>
#include <algorithm>
using namespace std;
/*
unsigned long long --- 数据类型 范围是[0,2^64-1]
用 unsigned long long来存储h,它可以溢出,溢出时就相当于模了一个2的64次方
*/
// 用ULL来模2的64次方,需要模2的64次方时都可以直接用ULL来做
// 模2的64次方是为了把任何一个字符串映射到从0带2的64次方-1之间的一个数
typedef unsigned long long ULL;
// P进制,P为经验值:取131或者13331
const int N = 100010, P = 131;
int n, m;
char str[N];
ULL h[N], p[N];
//---------------------核心代码开始-----------------------
// 得到l到r直接的哈希值,l为高位,r为低位
ULL get(int l, int r)