字符串算法_字符串哈希

原文:https://oi-wiki.org/string/hash/

字符串哈希

方法以,M进制的形式来表示一个字符串,那么这个字符串就可以轻松计算 i~j 之间的hash值
当只有小写/大家字母时,M=131 而hash值,可以使用unsigned long long 来表示,这时不再需要求余

方法应用
  1. 字符串匹配。思路:对比hash值
  2. 允许k次失配的字符串匹配 。即:允许k次字符值不对的情况下仍然匹配。思路:使用 哈希二分来解决
  3. 最长回文子串。 顺着/倒着计算hash值。设Ri为以i为结尾的字符串的最长回文子串,则有 Ri<=R(i-1)+2;
  4. 确定字符串中不同子字符串的数量。思路:n*n遍历计算 i:起始点 len 长度 查找hash值有多少个不一样,则为结果
    核心代码
#define NMAX 1000005
#define ull unsigned long long
#define MAGICNUM 131

char szStr[NMAX];
ull f[NMAX];
ull p[NMAX];

void initHash(const char* szStr){
    int len = strlen(szStr);
    p[0] = 1;
    for( int i=0;i<len;++i){
        int dig = szStr[i] - 'a' + 1;
        f[i+1] = f[i] * MAGICNUM + dig;
        p[i+1] = p[i] * MAGICNUM;
    }
}

//l/r 都是包含的,但是相较于cpp的index ,此值为 cpp的index+1 (即:从1开始)
ull getHash(int l,int r){
    return f[r] - f[l-1] * p[r-l+1];
}
posted @ 2022-04-24 15:59  传说中的水牛  阅读(110)  评论(0编辑  收藏  举报