字符串哈希学习记录

什么是字符串哈希

    字符串哈希就是建立一种映射关系,将一段字符串映射到一个数字值上。这种映射关系满足 映射数字不同的字符串一定不同,但映射数字相同的字符串可能相同(这种情况被称为哈希碰撞)

怎么实现字符串哈希

    通常是将字符串按位加入到一个函数中,最后运算得到的结果就是字符串的哈希值。比较常用的哈希办法是HASH=∑bi*si 或者反过来,最后对一个很大的质数取模。

字符串哈希的时间复杂度

    一般来说,将两个没有关系的字符串哈希后比较值跟直接暴力匹配没有区别,但是如果每次需要比较的只是一个字符串的子串,那么就可以对字符串整体进行O(n)预处理后O(1)时间给出任意子串的哈希值。

代码实现

    

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int MAXN = 6e5 + 5;
const ll MOD1 = 1e9 + 7;
const ll MOD2 = 998244353;
const ll b = 114514;

ll b1[MAXN], b2[MAXN];

void init()
{
    b1[1] = b2[1] = b;
    for (ll i = 2; i < MAXN; i++)
    {
        b1[i] = (b1[i - 1] * b) % MOD1;
        b2[i] = (b2[i - 1] * b) % MOD2;
    }
}

struct SHASH
{
    ll f1[MAXN], f2[MAXN], slen;
    void init(ll *str,ll slen)
    {
        ll s = str;
        f1[1] = f2[1] = s[1];
        for (ll i = 2; i <= slen; i++)
        {
            f1[i] = ((f1[i - 1] * b) % MOD1 + s[i]) % MOD1;
            f2[i] = ((f2[i - 1] * b) % MOD2 + s[i]) % MOD2;
        }
        return;
    }

    ll hash1(ll l, ll r)
    {
        return ((f1[r] - (f1[l - 1] * b1[r - l + 1]) % MOD1 + MOD1) % MOD1);
    }

    ll hash2(ll l, ll r)
    {
        return ((f2[r] - (f2[l - 1] * b2[r - l + 1]) % MOD2 + MOD2) % MOD2);
    }
};

 

posted @ 2022-07-28 11:09  Guilliman  阅读(66)  评论(0)    收藏  举报