首页 > 其他分享 >字符串哈希

字符串哈希

时间:2023-07-19 15:35:21浏览次数:30  
标签:hash int long 哈希 字符串 MOD define


题目描述

给定一个长度为 n 的字符串,再给定 m 个询问,每个询问包含四个整数 l1,r1,l2,r2,请你判断 [l1,r1]和 [l2,r2] 这两个区间所包含的字符串子串是否完全相同。

字符串中只包含大小写英文字母和数字。

输入格式

第一行包含整数 n 和 m,表示字符串长度和询问次数。

第二行包含一个长度为 n 的字符串,字符串中只包含大小写英文字母和数字。

接下来 mm 行,每行包含四个整数 l1,r1,l2,r2,表示一次询问所涉及的两个区间。

注意,字符串的位置从 1 开始编号。

输出格式

对于每个询问输出一个结果,如果两个字符串子串完全相同则输出 Yes,否则输出 No

每个结果占一行。

数据范围

1≤n,m≤105

输入样例

输入数据 1

8 3
aabbaabb
1 3 5 7
1 3 6 8
1 2 1 2

输出数据 1

Yes
No
Yes

前置知识字符串哈希_算法有三种,自然溢出,单字符串哈希_算法,双字符串哈希_算法

  • 自然溢出:我们定义base,而MOD对于自然溢出方法,就是 unsigned long long 整数的自然溢出(相当于MOD 是字符串哈希_字符串_04)
  • 单hash:我们定义base和mod,有了对应的要求余MOD,一般用long long,对应的hash公式为
    字符串哈希_字符串_05
    字符串哈希_算法:用字符串Hash,最怕的就是,出现冲突的情况,即不同字符串却有着相同的hash值,这是我们不想看到的。所以为了降低冲突的概率,可以用双Hash方法。
    将一个字符串用不同的Base和MOD,hash两次,将这两个结果用一个二元组表示,作为一个总的Hash结果。那么公式为
    字符串哈希_字符串_07

对于截取字符串哈希_字符串_08范围内的字符串,公式为

字符串哈希_字符串_09

#include <bits/stdc++.h>
using namespace std;
#define accelerate ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define int long long
#define mod 1000000007
#define ll unsigned long long
#define PII pair<int,int>
#define INF 0x3f3f3f3f
const int N=1e5+10;
const int base=29;
int n,m,k,x,y,T,xx,yy;
int hashh[N],p[N];
char a[N];
int getnum(int x,int y){
	return hashh[y]-hashh[x-1]*p[y-x+1];
}
signed main(){
	accelerate;
	cin>>n>>m;
	cin>>a+1;
	p[0]=1;
	for(int i=1;i<=n;i++){
		p[i]=p[i-1]*base;
		hashh[i]=hashh[i-1]*base+(a[i]-'a'+1);
	}
	while(m--){
		cin>>x>>y>>xx>>yy;
		if(getnum(x,y)==getnum(xx,yy)) cout<<"Yes\n";
		else cout<<"No\n";
	}
	return 0;
}

标签:hash,int,long,哈希,字符串,MOD,define
From: https://blog.51cto.com/u_16085557/6776631

相关文章

  • mysql字符串类型面试题
    mysql有哪些字符串类型?MySQL中有以下几种常见的字符串类型:CHAR:固定长度字符串,最多可以存储255个字符。VARCHAR:可变长度字符串,最多可以存储65535个字符。TEXT:用于存储较长的文本字符串,最多可以存储65535个字符。TINYTEXT:用于存储非常短的文本字符串,最多可以......
  • android 复制字符串 禁止出内容已成功复制到剪切板
    Android复制字符串:禁止出内容已成功复制到剪切板在Android应用程序中,我们经常需要实现将某个文本内容复制到剪贴板的功能。这对于让用户方便地复制和粘贴文本非常有用。然而,在某些情况下,我们可能希望禁止用户复制某些特定的文本内容。本文将介绍如何在Android应用中实现复制字符串......
  • 写代码,找出两个字符串数组中相同的字符串存到新的字符串中,使用hashset
    时间复杂度:O(m+n)packageleetcode.arrayAndList;importjava.util.ArrayList;importjava.util.HashSet;importjava.util.Set;publicclassCommentStr{publicstaticvoidmain(String[]args){ArrayListans=newArrayList();//两个字符......
  • 剑指 Offer 58 - II. 左旋转字符串
    classSolution{public:stringreverseLeftWords(strings,intn){reverse(s.begin(),s.begin()+n);#反转用reverse而不是s.reversereverse(s.begin()+n,s.end());#这里用s.begin()+n而不是s.begin()+n+1,因为s.begin()是指向集......
  • 牛客网-回文字符串
    1.题目读题 回文字符串(AC)回文字符串就是正读和反读都一样的字符串,如“viv”、“nexen”、“12321”、“qqq”、“翻身把身翻”等。给定一个非空字符串str,在最多可以删除一个字符的情况下请编程判定其能否成为回文字符串;如果可以则输出首次删除一个字符所能得到的回文字......
  • python 删除列表中字符串
    Python删除列表中的字符串在使用Python进行编程时,经常需要对列表进行操作和修改。有时候,我们可能需要删除列表中的特定字符串。本文将介绍如何使用Python删除列表中的字符串,并提供代码示例。列表和字符串在了解如何删除列表中的字符串之前,我们需要先了解列表和字符串的基本概念......
  • python将字符串里面的空格替换为换行
    Python将字符串里面的空格替换为换行在Python编程中,字符串是一种常见的数据类型,它由一系列字符组成。有时候我们需要对字符串进行一些操作,比如替换字符串中的特定字符或者将字符串拆分成多行。本文将向您展示如何使用Python将字符串中的空格替换为换行符。字符串和空格在Python......
  • python将16进制数组转换成字符串
    Python将16进制数组转换成字符串在编程中,我们经常需要处理不同的数据类型和格式。其中,16进制是一种十分常见的数据表示方式,特别在加密和通信领域中经常用到。本篇文章将介绍如何使用Python将16进制数组转换成字符串,并提供相应的代码示例。什么是16进制?在计算机科学中,16进制(Hexad......
  • python正则匹配字符串
    Python正则匹配字符串介绍正则表达式(regularexpression)是一种强大的文本匹配工具。它使用特定的语法规则来描述和匹配字符串中的模式。Python内置的re模块提供了对正则表达式的支持,使得我们可以方便地在Python中进行字符串的匹配和处理。本文将详细介绍Python正则表达式的使用......
  • python怎么取字符串中第二个/到第三个/之间的字符串
    Python如何取字符串中第二个/到第三个/之间的字符串在Python中,我们可以使用字符串的切片操作来获取一个字符串中的特定部分。为了解决取字符串中第二个/到第三个/之间的字符串的问题,我们可以按照以下步骤进行操作:步骤1:找到第二个/的位置首先,我们需要找到字符串中第二个/的位置。......