• AcWing 138. 兔子与兔子 hash打卡


    很久很久以前,森林里住着一群兔子。

    有一天,兔子们想要研究自己的 DNA 序列。

    我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母)。

    然后我们每次选择两个区间,询问如果用两个区间里的 DNA 序列分别生产出来两只兔子,这两个兔子是否一模一样。

    注意两个兔子一模一样只可能是他们的 DNA 序列一模一样。

    输入格式

    第一行输入一个 DNA 字符串 S。

    第二行一个数字 m,表示 m 次询问。

    接下来 m 行,每行四个数字 l1,r1,l2,r2l1,r1,l2,r2,分别表示此次询问的两个区间,注意字符串的位置从1开始编号。

    输出格式

    对于每次询问,输出一行表示结果。

    如果两只兔子完全相同输出 Yes,否则输出 No(注意大小写)。

    数据范围

    1length(S),m10000001≤length(S),m≤1000000

    输入样例:

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

    输出样例:

    Yes
    No
    Yes


    题意:让你判断两个区间的字符串是不是相等
    思路:首先肯定不能暴力判断,说明我们查询的时候不能遍历字符串,肯定是O(1)~O(logn)里得出答案
    判断字符串相等这个我们可以使用字符串哈希,算出所有前缀哈希值,然后推出其他区间子串的哈希值,我推出其他区间的时候是用了
    快速幂算出,其实我们可以打出一个131的次方表,一般我们是化为131进制或者13331进制运算

    哈希定理
     
    #include<bits/stdc++.h>
    #define maxn 1000005
    #define mod 1000000007
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    char str[maxn];
    ull dp[maxn];
    ll l1,l2,r1,r2,n;
    ll len;
    void hash_code()
    {
        len=strlen(str+1);
        for(int i=1;i<=len;i++){
            dp[i]=dp[i-1]*131+str[i]-'a'+1;
        }
    } 
    ull quick_pow(ull a,ull b){
        ull ans=1;
        while(b){
            if(b&1) ans*=a;
            a=a*a;
            b=b/2;
        }
        return ans;
    }
    int main(){
        scanf("%s",str+1);
        scanf("%lld",&n);
        hash_code();
        for(int i=0;i<n;i++){
            scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
            ull m1,m2;
            m1=quick_pow((ull)131,r1-l1+1);
            m2=quick_pow((ull)131,r2-l2+1);
            if(dp[r1]-dp[l1-1]*m1==dp[r2]-dp[l2-1]*m2){
                printf("Yes
    ");
            }
            else{
                printf("No
    ");
            }
            
        }
    }


  • 相关阅读:
    D365FO Debug找不到w3cp进程
    D365FO 10.0PU32 开发环境 Data Management导出失败
    一张图看懂项目管理
    用户体验为什么重要?如何提升产品的用户体验?(写给产品小白)
    敏捷考证?你应该知道的敏捷体系认证(最全名单)
    漫画:禅道程序员的一天
    敏捷开发管理--任务分解经验之谈
    漫画:优秀程序员的必备特质有哪些?
    漫画:女生/男生告白攻略
    漫画:程序员脱单秘籍
  • 原文地址:https://www.cnblogs.com/Lis-/p/10890417.html
Copyright © 2020-2023  润新知