C++是实现字符串哈希
关于字符串哈希:
其中需要主义的一个小地方:
字符串前缀哈希的题目:
代码实现:
-
// 字符串前缀哈希法:
-
-
-
using namespace std;
-
-
// 把字符串看成是一个 P 进制数,每个字符的 ASCII 码对应数的一位
-
// ASCII 范围 0 - 127,最少 128 进制,经验上取 131 或 13331 冲突率低
-
const int N = 100010, P = 131;
-
typedef unsigned long long ULL;
-
-
//str存的是字符串
-
//h[N]存的是字符串的映射值,h[i] 对应数组的前i个元素的映射值
-
//p[N]存的是加权
-
char str[N];
-
ULL h[N], p[N];
-
-
ULL get(int l, int r)
-
{
-
return h[r] - h[l - 1]*p[r - l 1];
-
}
-
-
int main()
-
{
-
int n = 0, m = 0;
-
scanf("%d%d", &n, &m);
-
scanf("%s", str 1); //对应下面的前缀和,下标从1开始
-
-
-
p[0] = 1;
-
for(int i = 1; i <= n; i )
-
{
-
h[i] = h[i - 1] * P str[i];
-
p[i] = p[i - 1] * P; //对应公式
-
}
-
-
while(m--)
-
{
-
int l1 = 0, r1 = 0, l2 = 0, r2 = 0;
-
scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
-
-
if(get(l1, r1) == get(l2, r2)) puts("Yes");
-
else puts("No");
-
}
-
return 0;
-
}
写在最后,一些补充的地方:
1. 补充一点,在C 中int溢出是undefined behavior,是否会取模取决于编译器。unsigned int溢出是define behavior,在溢出时会自动取模
2. 把字符串看成是一个 P 进制数,每个字符的 ASCII 码对应数的一位
3. ASCII 范围 0 - 127,最少 128 进制,经验上取 131 或 13331 冲突率低
4. 字符串很长,对应的数太大,通过模 2^64 把它映射到 [0, 2^64 - 1]
5. 用 unsigned long long 存储,溢出相当于对 2^64 取模,省略了手动运算,该方法的好处是,可以利用前缀哈希直接求出子串哈希(减去高位)
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfiicaa
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24