当前位置:网站首页>841. String hash
841. String hash
2022-07-07 19:55:00 【Hunter_ Kevin】
Given a length of n String , Re given m A asked , Each query contains four integers l1,r1,l2,r2, Please judge [l1,r1] and [l2,r2] Whether the strings and substrings contained in these two intervals are exactly the same .
The string contains only uppercase and lowercase English letters and numbers .
Input format
The first line contains integers n and m, Represents the length of the string and the number of queries .
The second line contains a length of n String , The string contains only uppercase and lowercase English letters and numbers .
Next m That's ok , Each line contains four integers l1,r1,l2,r2, Indicates the two intervals involved in a query .
Be careful , The position of the string is from 1 Numbered starting .
Output format
Output a result for each query , If two string substrings are identical, output Yes, Otherwise output No.
Each result takes up one line .
Data range
1≤n,m≤105
sample input :
8 3
aabbaabb
1 3 5 7
1 3 6 8
1 2 1 2
sample output :
Yes
No
Yes
Ideas :
①、 String subscript from 1 Start
②、 First , The given string , Press the subscript to find from left to right i Is the last string , Find its character based ascii code , be based on P Hexadecimal accumulated string hash value
③、 Based on empirical values , A string of hash value , With 264 Data size for storage , With 131 perhaps 13331 When it is a decimal number , Cumulative hash It's worth it 264 modulus , The probability of conflict is very small , Think ignore
④、unsigned long long just 264, use ull For storage , If the data overflows , That is, high-order truncation , Keep it low , It's equivalent to automatic Yes 264 modulus
⑤、 The key point of the algorithm is the prefix of string hash Value preprocessing and p^i Array preprocessing
seekA string l~r
Corresponding hash value , It only needsh[r] - h[l-1] * p[(r-1) - (l-1-1)]
namelyh[r] - h[l-1] * p[r-l+1]
Example :123456
seek 34 Of hash value
1234 - 12 * 10^2 == 34
#include <iostream>
#include <cstring>
using namespace std;
typedef unsigned long long ULL;
const int N = 100010, P = 131;
// Empirical value Use 131 perhaps 13331 Use 2^64 To store the size of the string hash value , Theoretically With 131 perhaps 13331 For the string of hexadecimal numbers hash value mod 2^64 The probability of conflict after that is very small , It can be seen that there is no conflict
ULL h[N], p[N];//h The array stores the string before the subscript hash value ,p The array stores the bit weight of the subscript position base
char s[N];
int main()
{
int n, m;
cin>> n >> m >> s+1;
// Find the string of hash Value preprocessing results and Subscript to be i The position of the corresponding p^i
p[0] = 1;
for(int i = 1; i <= n; i++)
{
p[i] = p[i-1] * P;// Find the subscript i need × Bit weight of p^0 p^1 p^2 p^3 1 1*p 1*p*p 1*p*p*p
h[i] = h[i-1] * P + s[i];// Find out i The position corresponds to hash value ,ULL After spilling , High truncation , Keep it low , It's equivalent to 2^64 modulus ,s[i] The actual value is the hash value of the character
}
int l1,r1,l2,r2;
while(m -- )
{
cin>>l1>>r1>>l2>>r2;
ULL x = h[r1] - h[l1-1] * p[r1-l1+1]; // Find a string hash value ,r1 Corresponding hash value - (l1-1) Corresponding hash value * p^(r1-l1+1) namely The difference between the two positions p^(r1-1 - (l1-1-1))
ULL y = h[r2] - h[l2-1] * p[r2-l2+1];
if(x == y)cout<<"Yes"<<endl; // If the hash values of two strings are equal , Then the strings are equal
else cout<<"No"<<endl;
}
return 0;
}
边栏推荐
- how to prove compiler‘s correctness
- Navicat连接2002 - Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘解决
- 注解。。。
- String - string (Lua)
- How to buy stocks on your mobile phone and open an account? Is it safe to open an account
- 银行理财产品怎么买?需要办银行卡吗?
- PMP practice once a day | don't get lost in the exam -7.7
- How to share the same storage among multiple kubernetes clusters
- 微信公众号OAuth2.0授权登录并显示用户信息
- RESTAPI 版本控制策略【eolink 翻译】
猜你喜欢
杰理之测试盒配置声道【篇】
Make this crmeb single merchant wechat mall system popular, so easy to use!
openEuler 有奖捉虫活动,来参与一下?
Kirin Xin'an with heterogeneous integration cloud financial information and innovation solutions appeared at the 15th Hunan Financial Technology Exchange Conference
LeetCode力扣(剑指offer 36-39)36. 二叉搜索树与双向链表37. 序列化二叉树38. 字符串的排列39. 数组中出现次数超过一半的数字
Empowering smart power construction | Kirin Xin'an high availability cluster management system to ensure the continuity of users' key businesses
关于ssh登录时卡顿30s左右的问题调试处理
AD域组策略管理
Experiment 1 of Compilation Principle: automatic implementation of lexical analyzer (Lex lexical analysis)
一张图深入的理解FP/FN/Precision/Recall
随机推荐
ASP. Net kindergarten chain management system source code
索引总结(突击版本)
开源OA开发平台:合同管理使用手册
How to open an account for stock speculation? Excuse me, is it safe to open a stock account by mobile phone?
杰理之按键发起配对【篇】
关于ssh登录时卡顿30s左右的问题调试处理
Jürgen Schmidhuber回顾LSTM论文等发表25周年:Long Short-Term Memory. All computable metaverses. Hierarchical reinforcement learning (RL). Meta-RL. Abstractions in generative adversarial RL. Soccer learn
how to prove compiler‘s correctness
Welcome to the markdown editor
关于自身的一些安排
LeetCode 648(C#)
PMP practice once a day | don't get lost in the exam -7.7
Le PGR est - il utile au travail? Comment choisir une plate - forme fiable pour économiser le cœur et la main - d'œuvre lors de la préparation de l'examen!!!
银行理财产品怎么买?需要办银行卡吗?
The strength index of specialized and new software development enterprises was released, and Kirin Xin'an was honored on the list
【剑指offer】剑指 Offer II 012. 左右两边子数组的和相等
杰理之手动配对方式【篇】
Navicat连接2002 - Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘解决
UCloud是基础云计算服务提供商
最多可以参加的会议数目[贪心 + 优先队列]