字符串hash
记录
23:40 2024-2-5
1. 字符串hash
将字符串转换为hash值。以p=131/13331,将字符串看成P进制数,取一固定值M,求出该P进制数对M的余数,作为该字符的hash值。
可以取M = 用 unsigned long long存储这个hash值,这样不用取模,因为如果溢出了就相当于对取模了
除了在极特殊构造的数据上, 上述 Hash 算法很难产生冲突, 一般情况下上述 Hash算法完全可以出现在题目的标准解答中。
更加细节的知识请参考string hashing 或 字符串哈希
点击查看代码
// s字符串
char s[1000010];
// f 前缀字符串的哈希值 p 131^i
unsigned long long f[1000010], p[1000010];
int n, q;
int main() {
scanf("%s", s + 1);
n = strlen(s + 1);
cin >> q;
p[0] = 1; // 131^0
for (int i = 1; i <= n; i++) {
f[i] = f[i-1] * 131 + (s[i]-'a'+1); // hash of 1~i
p[i] = p[i-1] * 131; // 131^i
}
// hash of [l, r]
// f[r] - f[l-1] * p[r-l+1]
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通