哈希
【哈希】
哈希可以分成两块:哈希函数和哈希表。
哈希函数是一种对应关系,它可以把任意类型映射为一个不太大的整数。
例如字符串,我们可能希望在字符串上记录一些属性。但是字符串不能当下标,那我们就只能加个大常数用 map
。
这时,哈希函数出场了!如果我们有一个哈希函数
对于这个哈希函数
因为
【字符串进制哈希】
把字符串视作一个
例如
但这样答案可能是很大很大的,所以有一个方法:设定一个数
那我们为什么对进制哈希情有独钟?因为进制哈希带来了一些和进制整数类似的性质,很方便
比如我们现在处理出
而且两字符串拼接后的哈希值也能方便求出。
当然,哈希一般只判断是否相等,对于更复杂的信息,那就只能另寻他法了~
注意是两个非空前缀。
基础想法:二重循环枚举两个前缀 + 一重循环判断是否是前缀,妥妥炸掉。
优化:先只用一重循环枚举一个前缀,第二个前缀位置可以二分(越大越好,越小越可行),判断是否是前缀可以哈希。
直接枚举前缀为循环节,然后枚举所有出现位置用哈希判断是否和循环节相等。
当枚举前缀长度
当枚举前缀长度
当枚举前缀长度
总时间复杂度
而当
当然,也可以利用性质:如果
判断
-
建立
; -
预处理出
的前缀哈希; -
如果一个子段在
中的哈希值相等,就是回文子段。
这题里面类似处理:先全部取反,然后翻转。再在两个字符串里跑哈希。
但是
先对每个单词哈希。然后维护当前拼好的字符串的前缀哈希。
我们可以每次在拼上一个字符串时,前缀哈希递推——因为加字符只在末尾加。
查找最大匹配长度二分即可。
有点像电子字典?
排序!!!
先排序,这样我们只用找出所有段,段内任意两个都相差
判断两个串是否差一,用哈希尝试删去某一个位置的字符后是否相等。
具体实现时可以预处理出所有字符串删去某个位置后的 Hash 值,存在一个数组里。
然后一重循环枚举删去哪个位置,找出所有段:段内删去这个位置后都相等。
【哈希思想】
记给定多项式为
先有暴力思路:枚举
我们可以改一改判断条件:
我们把每个
还有一个专属于这种多项式题的优化:可以搞几个模数
不可以,总司令
哈希的想法:把复杂数对应到简单数上。
那我们也可以把复杂操作对应到简单操作上,维护复杂数对应到维护简单数上!
设点
① 删一条边,
② 删一个点,
③ 恢复一条边,
④ 加一个点,
出错的概率怎么算?
假设随机数范围
单次不错
那么全部操作正确的概率,在我们随机数范围取
【哈希表】
可以用 Hash 值做索引,搞数组字典。
优点:
unordered_map 自己定义哈希函数模板:
struct my_hash {
long long operator()(const vector<int> &v) const {
long long res = 0, p = 131, md = 987656783;
for (auto i: v)
res = (res * p + i) % md;
return res;
}
};
unordered_map<vector<int>, int, my_hash> mp;
int main() {
vector<int> a(3, 5);
mp[a] = 5;
cout << mp[a];
return 0;
}
哈希可以通过长度和本身的哈希值,
这意味着我们可以用线段树维护!
而查询是否存在,可以用 unordered_map 建立一个以哈希值为索引,布尔类型的哈希表。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!