• 【c++刷题Day3】专题5数组标记&哈希T3


    这是C++刷题的Day3
    在这里插入图片描述
    🕋题目描述
    🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
    给定一个长度为 n 的字符串,再给定 m 个询问,每个询问包含四个整数 l1,r1,l2,r2,请你判断 [l1,r1] 和 [l2,r2]

    这两个区间所包含的字符串子串是否完全相同。

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

    第一行包含整数 n
    和 m

    ,表示字符串长度和询问次数。

    第二行包含一个长度为 n

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

    接下来 m
    行,每行包含四个整数 l1,r1,l2,r2

    ,表示一次询问所涉及的两个区间。

    注意,字符串的位置从 1

    开始编号。
    输出格式

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

    每个结果占一行。
    数据范围

    1≤n,m≤10^5

    输入样例:

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

    输出样例:

    Yes
    No
    Yes

    🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
    🔑思路

    模板:字符串哈希

    💯CODE代码:

    #include
    using namespace std;
    const int N=1e5+10,P=131;
    typedef unsigned long long ull;
    ull p[N],h[N];
    char str[N];int n,m;
    int l1,r1;int l2,r2;
    bool check(int l1,int r1,int l2,int r2){
    	ull x=h[r1]-h[l1-1]*p[r1-l1+1],y=h[r2]-h[l2-1]*p[r2-l2+1];
    	return x==y;
    }
    int main(){cin>>n>>m>>str+1;p[0]=1;
    	for(int i=1;i<=n;i++)p[i]=p[i-1]*P,h[i]=h[i-1]*P+str[i];
    	while(m--){cin>>l1>>r1>>l2>>r2;cout<<(check(l1,r1,l2,r2)?"Yes\n":"No\n");}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    【Kingbase FlySync】评估工具安装及使用
    vue入门到精通-第一个vue程序和基本语法组件
    微电网鲁棒性研究(Matlab代码实现)
    Spring事务的属性
    rust cargo
    Python库——Pandas数据分析
    [附源码]java毕业设计医院疫情疾控管理系统
    使用canvas实现图纸标记及回显
    Monkey二次开发 -- Monkey jar包构建
    给 Pod 添加 DNS 记录
  • 原文地址:https://blog.csdn.net/m0_60519493/article/details/126373165