字符串算法_字符串哈希


原文: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