给定一个长度为N的字符串,再给定M个询问,每个询问包含四个整数l1,r1,l2,r2,qi,请判断l1,r1 l2 r2 两个区间所包含的字符串是否相同

简介: 关于字符串哈希

进制哈希。即把每个字符串按进制得出对应的数字。根据y总的模板,进制P取131可以很好地降低冲突概率

假设不出现冲突,那么每个子串,唯一对应一个P进制的哈希值。

先前缀处理一下所有前缀的哈希值。

那么对于[L,R],已知[1,R]和[1,L]的哈希值,需要求[L,R]的哈希值。

假设有:

ABCDEFGH

求[6,8]==FGH的哈希值

推导过程:

ABCDEFGH

ABCDE

它俩之间差三个字符(8-6+1)

那么ABCDE*P^(8-6+1),就是ABCDE000,

两者一减,就是FGH的哈希值了。

即:h[R]-h[L-1]*P^(R-L+1)

h[i]=h[i-1]*P+s[i]

h负责存前缀哈希

p[]负责存次放数

include

include

include

include

include

include

include

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e5+10,maxn2=31*maxn;
const int P= 131;
ull h[maxn],p[maxn];
char s[maxn];
int n,m;
void init()
{

for(int i=1;i<=n;i++)
{
    p[i]=p[i-1]*P;
    h[i]=h[i-1]*P+s[i];
}

}
ull check(int l,int r)
{

return h[r]-h[l-1]*p[r-l+1];

}
int main()
{

p[0]=1;    
scanf("%d%d%s",&n,&m,s+1);
init();
while(m--)
{
    int l1,r1,l2,r2;
    scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
    if(check(l1,r1)==check(l2,r2))
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;
}

}

目录
相关文章
|
2月前
|
算法 测试技术 编译器
【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项
题目描述 题目 在字符矩阵中查找给定字符串的所有匹配项 给定一个M×N字符矩阵,以及一个字符串S,找到在矩阵中所有可能的连续字符组成的S的次数。所谓的连续字符,是指一个字符可以和位于其上下左右,左上左下,右上右下8个方向的字符组成字符串。用回溯法求解。
56 1
|
2月前
61.从键盘输入10个正数存入数组x中,然后输入要查找的整数a,如找到则输出a及a的下标,如找不到,则把a存入到数组的最后。
61.从键盘输入10个正数存入数组x中,然后输入要查找的整数a,如找到则输出a及a的下标,如找不到,则把a存入到数组的最后。
29 0
|
2月前
|
索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
|
9月前
题目:下列给定程序中函数fun的功能是:从p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。
题目:下列给定程序中函数fun的功能是:从p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。
|
11月前
|
存储 算法 JavaScript
设计并实现一个函数, 功能为给定一个存储为随机整数的数组,从中删除所有值为i的整数
设计并实现一个函数, 功能为给定一个存储为随机整数的数组,从中删除所有值为i的整数
|
11月前
|
算法
LeetCode-41 缺失的第一个正整数
LeetCode-41 缺失的第一个正整数
|
12月前
定义一个长度为10的整型数组,循环输入10个整数。 然后将输入一个整数,查找此整数,找到后输出下标,没找到给出提示。
定义一个长度为10的整型数组,循环输入10个整数。 然后将输入一个整数,查找此整数,找到后输出下标,没找到给出提示。
185 0
​判断给定字符序列是否是回文
​判断给定字符序列是否是回文
54 0
|
算法
给定m个不重复的字符 [a,b,c,d],以及一个长度为n的字符串tbcacbdata滑动窗口
给定m个不重复的字符 [a,b,c,d],以及一个长度为n的字符串tbcacbdata滑动窗口
183 0
|
算法 Java C语言
找出字符串中第一个匹配项的下标 (LeetCode 28)
找出字符串中第一个匹配项的下标 (LeetCode 28)
188 0