字符串hash

记录
23:40 2024-2-5

1. 字符串hash

将字符串转换为hash值。以p=131/13331,将字符串看成P进制数,取一固定值M,求出该P进制数对M的余数,作为该字符的hash值。
可以取M = \(2^{64}\) 用 unsigned long long存储这个hash值,这样不用取模,因为如果溢出了就相当于对\(2^{64}\)取模了

除了在极特殊构造的数据上, 上述 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]
}

题目记录

leetcode--5. 最长回文子串
POJ--3974 Palindrome

posted @ 2024-02-06 23:41  57one  阅读(8)  评论(0编辑  收藏  举报