哈希

基础思路:哈希是一种映射算法,也类似于‘进制’处理,一般会是131、13331进制,然后MOD越大越稳定(越不容易映射重复)

哈希常用于字符串匹配,在给定区间匹配中表现良好,以下是经典款:
const int P = 131; const int MOD = 998834567; int gethash(const string& s) { int h = 0; for (int i = 0; i < s.size(); i++) { h = (h * P + s[i]) % MOD; } return h; }
区间匹配:
int get(int l, int r) { return h[r] - h[l - 1] * p[r - l + 1]; } int main() { ... p[0] = 1;h[0] = 0; for (int i = 1; i <= n; i++) { p[i] = p[i - 1] * P; h[i] = h[i - 1] * P + s[i - 1]; } ..get(l1, r1) == get(l2, r2)... return 0; }

单哈希常常不稳定,可以采用拉链哈希或双模哈希
`
// 哈希基数和两个大模数
const int P = 131;
const int MOD1 = 1e9 + 7;
const int MOD2 = 1e9 + 9;

// 使用 pair 存储双哈希值
map<pair<int, int>, int> mp;

signed main() {
int N;cin >> N;
int ans = 0;
while (N--) {
string s;cin >> s;
int hash1 = 0, hash2 = 0;
for (int i = s.size() - 1; i >= 0; i--) {
int val = s[i] - 'a' + 1;
hash1 = (hash1 * P + val) % MOD1;
hash2 = (hash2 * P + val) % MOD2;
pair<int, int> h = {hash1, hash2};
if (!mp[h]) {
mp[h] = 1;
ans++;
}
}
}
cout << ans << endl;
return 0;
}`
双模哈希中的每一个string对应两个哈希值

拉链哈希在每个哈希位上建立vector,当有两个不同的string映射出相同哈希值时,直接存到vector中,查询时需要遍历它
map<int,vector<int>>mp;

posted @ 2025-08-16 23:54  yubai111  阅读(5)  评论(0)    收藏  举报