字符串哈希

简介: 原题链接841. 字符串哈希 - AcWing题库 视频讲解AcWing 841. 字符串哈希 - AcWing



原题链接841. 字符串哈希 - AcWing题库


视频讲解AcWing 841. 字符串哈希 - AcWing

5.1.png

全称字符串前缀哈希法,把字符串变成一个p进制数字(哈希值)实现不同的字符串映射不同的数字

对形如 X1X2X3⋯Xn−1Xn 的字符串,采用字符的ascii 码乘上 P 的次方来计算哈希值。

映射公式

image.png

比较不同区间的子串是否相同,就转化为对应的哈希值是否相同

求一个字符串哈希值就相当于求前缀和,

求一个字符串的子串哈希值就相当于求区间和

image.png

 区间和公式的理解: ABCDE 与 ABC 的前三个字符值是一样,只差两位,
乘上P的二次方把 ABC 变为 ABC00,再用 ABCDE - ABC00 得到 DE 的哈希值

image.png

使用:typedef unsigned long long,得到的哈希值就不用取模了,因为unsigned long long会把溢出的部分自动取模

image.png

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
typedef unsigned long long ULL;
const int N = 1e5+5,t = 131;//131 13331(经验值)
ULL h[N],p[N];
// h[i]前i个字符的hash值
// 字符串变成一个p进制数字,体现了字符+顺序,需要确保不同的字符串对应不同的数字
// t = 131 或  13331 在99%的情况下不会出现冲突
// 使用场景: 两个字符串的子串是否相同
ULL query(int l,int r){
    return h[r] - h[l-1]*p[r-l+1];
}
int main(){
    int n,m;
    cin>>n>>m;
    string x;
    cin>>x;
    //字符串从1开始编号,h[1]为前一个字符的哈希值
    p[0] = 1;
    h[0] = 0;
    for(int i=1;i<=n;i++){
        p[i] = p[i-1]*t;            
        h[i] = h[i-1]*t +x[i];      //前缀和求整个字符串的哈希值
    }
    while(m--){
        int l1,r1,l2,r2;
        cin>>l1>>r1>>l2>>r2;
        if(query(l1,r1) == query(l2,r2)) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}


相关文章
|
19天前
|
Java
5.最长回文子串
5.最长回文子串
|
2月前
|
算法 NoSQL 容器
Rabin-Karp字符串哈希算法
Rabin-Karp字符串哈希算法
|
2月前
|
算法
【算法总结】字符串哈希
【算法总结】字符串哈希
52 0
|
C语言
next数组的两种求法详解及完整代码
求字符串的next数组: 方法一: 这里我们将next数组第1,2位分别设为0,1(还有-1,0这种设法,这里先将其设为0,1若有需要再减一即可) 后面求解每一位的next值时,根据前一位进行比较。 从第三位开始,将前一位与其next值对应的内容进行比较, 如果相等,则该位的next值就是前一位的next值加上1; 如果不等,向前继续寻找next值对应的内容来与前一位进行比较, 直到找到某个位上内容的next值对应的内容与前一位相等为止, 则这个位对应的值加上1即为需求的next值; 如果找到第一位都没有
300 0
next数组的两种求法详解及完整代码
|
9月前
|
算法
next数组(详细求法)
next数组(详细求法)
150 0
|
算法
算法:next数组的求法详解
算法:next数组的求法详解
782 0
算法:next数组的求法详解
|
算法 Java 索引
最长回文子串
最长回文子串
98 0
最长回文子串
|
算法
LeetCode算法:求出字符串的最大回文子串 及 长度【只利用字符串反转就可】
LeetCode算法:求出字符串的最大回文子串 及 长度【只利用字符串反转就可】
65 0
哈希——18. 四数之和
本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助