首页 > 其他分享 >Acwing题解系列——841. 字符串哈希

Acwing题解系列——841. 字符串哈希

时间:2024-09-21 10:50:39浏览次数:12  
标签:str 841 int 题解 d% 次方 哈希 字符串

#include<iostream>
using namespace std;
const int N=100010;
const int P=131;
/* 题解 https://www.acwing.com/solution/content/24738/ 可以 
把字符串变成一个p进制数字(哈希值),实现不同的字符串映射到不同的数字。
采用字符的ascii 码乘上 P 的次方来计算哈希值。
X1X2X3...Xn字符串  
映射公式 (X1×Pn-1次方+X2×Pn-2次方+?+Xn?1×P1+Xn×P0次方)modQ
注意点:
1. 任意字符不可以映射成0,否则会出现不同的字符串都映射成0的情况,比如A,AA,AAA皆为0
2. 冲突问题:通过巧妙设置P (131 或 13331) , Q (2^64)一般可以理解为不产生冲突。

问题是比较不同区间的子串是否相同,就转化为对应的哈希值是否相同。
求一个字符串的哈希值就相当于求前缀和,求一个字符串的子串哈希值就相当于求部分和。
*/
char str[N];
typedef unsigned long long ULL;//最大到2^64 
ULL h[N],p[N];
//ULL是他们的值 好多次方所以可能爆int h[i]是前i个字符的hash值
//p[i]就是p的i次方
ULL get(int l,int r){
    return h[r]-h[l-1]*p[r-l+1];
}
int main(){
    int n,m;
    scanf("%d%d%s",&n,&m,str);//如果用str+1 使得字符串从1开始
    //用string类的话 就要i从0到n-1那一套 
    p[0]=1;
    h[0]=0;
    for(int i=0;i<n;i++){//str+1就要从1到n 
        p[i+1]=p[i]*P;//p[i]=p[i-1]*P
        h[i+1]=h[i]*P+str[i];
    }
    while(m--){
        int l1,r1,l2,r2;
        scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
        if(get(l1,r1)==get(l2,r2)) printf("Yes\n");
        else printf("No\n"); 
    }
    return 0;
}

标签:str,841,int,题解,d%,次方,哈希,字符串
From: https://blog.csdn.net/m0_73290253/article/details/142412039

相关文章

  • 帝国CMS7.5使用常见问题解答
    帝国CMS7.5使用常见问题解答一、7.5版的点击显示验证码如何调用?加载AJAX脚本文件在显示验证码的页面中加载 /e/data/js/ajax.js 文件。例如在HTML中加入:html <scriptsrc="/e/data/js/ajax.js"></script>显示验证码使用帝国CMS提供的验证码显示方法......
  • CF538H Summer Dichotomy 题解
    自己做的\^w^/。对于\(m\)个限制,我们得到了一个图,若不是二分图则无解,否则对于每个连通块有\([l_1,r_1],[l_2,r_2]\)的限制,表示对于两组的人数限制(注意此处\(1,2\)并不代表组\(1\),\(2\))。不妨令\(n_1\gen_2,(r_1>r_2\operatorname{or}r_1==r_2\operato......
  • 力扣题解2376
    大家好,欢迎来到无限大的频道。今日继续给大家带来力扣题解。题目描述(困难):统计特殊整数如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。给你一个 正 整数 n ,请你返回区间 [1,n] 之间特殊整数的数目。​解题思路:要计算区间([1,n])之间的......
  • 题解 GD230531C【眺望】
    题目描述有\(n\)座灯塔排成一排,第\(i\)座灯塔的高度是\(a_i\)。你需要求出有多少对\(l<r\)满足\(a_l=a_r\),且\(\foralll<i<r,a_i<a_l\)。灯塔的高度有\(Q\)次修改,每次给定\(x,h\),表示将\(a_x\)修改为\(h\)。求出修改之前和每次修改之后的答案。\(n......
  • CF538G 题解
    CF538G题意\(s\)为长为\(l\)的由U、L、D、R组成的操作序列,一个机器人从\((0,0)\)开始按照\(s_{1\siml}\)的顺序循环行动\(+\infty\)次。给定n个形如\((t_i,x_i,y_i)\)的限制,表示第\(t_i\)时刻到达\((x_i,y_i)\)。构造\(s_{1\siml}\)。思路首先可以......
  • 力扣188-买卖股票的最佳时机 IV(Java详细题解)
    题目链接:188.买卖股票的最佳时机IV-力扣(LeetCode)前情提要:本题是由123.买卖股票的最佳时机III-力扣(LeetCode)变形而来,123是只能买卖俩次股票,该题是只能买卖k次股票,我相信当你做完这道题或者看完我上道题的题解,那么写这道题会轻松一点。因为本人最近都来刷dp类的题......
  • CF1977E 题解
    根据Dilworth定理,该图能被两条互不相交的链覆盖。从小到大加点。我们现在需要维护两个栈,每个栈维护每条链的点。若两个栈头没有连边,那么对于新加入的点,一定可以放到其中一个栈。现在唯一的问题是,新加入的点可能可以放入两个栈。我们可以再开一个栈三,用来维护以上述点为头的......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【模拟】2024E-转骰子
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路构建长度为6的数组表......
  • 题解:洛谷P9934 [NFLSPC #6] 绝不能忘记的事……
    题目链接:洛谷P9934[NFLSPC#6]绝不能忘记的事……我hatelove大力分讨。这道题先分三种大情况:N在左边,N在中间,N在右边。声明:以下分类讨论中,a,b,c,d均为记住的字符串。记录操作N在左边当复制串形如Nab,可以用map<string,int>记录。当复制串形如NaH,那么......
  • 【问题解决】Web在线办公系统-数据爬取结果乱码
    问题描述在【热门电影】模块,通过jsoup爬虫并解析网页数据时,执行代码,出现“中文乱码”问题。解决方法由于网页自带的编码方式与后端开发中jsoup解析的编码方式不匹配,需要修改后端解析网页的编码方式。//设置爬取网页的地址Stringurl="https://movie.douban.com/......