字符串哈希
进制哈希
BKDRHash哈希函数
字符串哈希:
我们希望这一个映射是个单射,即保证任意的字符串对应的数字是唯一的,也就是不出现一个数字对应两个字符串等情况。
BKDRHash
BKDRHash是一种“进制哈希”,计算步骤非常简单。设定一个进制
注意:
由于得到的哈希值都很大,不能直接映射到一个巨大的空间上,所以一般都需要限制空间。方法是取余,把得到的哈希值对一个设定的空间大小
编程时可以采用一种隐性取余的方法。取空间大小为
举例子:
以字符串“abc”为例,令进制
进制P常用的值有
由于常常会碰到到字符串匹配的题目中,所以验证某两段子串是否相等这个方法很重要
#include <bits/stdc++.h> using namespace std; using u64 = unsigned long long; u64 base = 13331; vector<u64>p, hx; //p存进制位,hx存当前字符串长度的哈希值 //也可以把hx理解成前缀和数组 void Hash(string &s) { s = " " + s; int N = s.size(); p.resize(N + 1), hx.resize(N + 1); p[0] = 1, hx[0] = 0; for (int i = 1; i < s.size(); i++) { p[i] = p[i - 1] * base; //存进制数 hx[i] = hx[i - 1] * base + s[i]; //字符串哈希 } } u64 get(int l, int r) { //获取子串的哈希,常用来字符串匹配 return hx[r] - hx[l - 1] * p[r - l + 1]; } //检查两个子串是否相等 bool same(int l1, int r1, int l2, int r2) { return get(l1, r1) == get(l2, r2); } int main() { }
模版题P3370 【模板】字符串哈希
理解思想和方法,灵活的选择和调整自己的模板!!!
省赛难题D. Period
posted on 2024-07-26 13:06 swj2529411658 阅读(10) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)