字符串从入门到退竞(1)——哈希
哈希是将一个序列映射到一段整数区间的函数。
通常要求对于两个随机的等长的不同序列,哈希函数得到的值(以下简称 Hash 值)不同。
更概括地说,Hash 函数满足:
- 序列相同时,Hash 值一定相同
- 序列不同时,Hash 值大概率不同;若两个长度相等的不同字符串 Hash 值相同,我们称这是“哈希碰撞”。
实现
考虑各种原因,OI 上使用的哈希函数通常这样实现:
对于字符串
或者,有封闭形式:
容易发现,实际上是将序列视为一个以
为了控制值域,一般对一个大质数取模,或者让它自然溢出。
OI 界普遍认为取
但是对着你的程序总是能构造数据卡掉你,见工具 anti-hash。
快速求子串哈希值
对于比对两个序列的子串的情形,我们可以预处理哈希值做到单次
参考定义,容易发现:
预处理序列的前缀哈希值和
利用快速子串哈希可以
也可以快速去重,不必存储原串。
二维哈希
随便思考一个哈希方法是容易的,难点在如何快速求子矩阵的 Hash 值。
具体来说,对于矩阵
则其子矩阵
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App