zoukankan      html  css  js  c++  java
  • 兔子与兔子 [Hash]

    兔子与兔子

    描述

    很久很久以前,森林里住着一群兔子。有一天,兔子们想要研究自己的 DNA 序列。我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母),然后我们每次选择两个区间,询问如果用两个区间里的 DNA 序列分别生产出来两只兔子,这两个兔子是否一模一样。注意两个兔子一模一样只可能是他们的 DNA 序列一模一样。

    输入格式

    第一行一个 DNA 字符串 S。
    接下来一个数字 m,表示 m 次询问。
    接下来 m 行,每行四个数字 l1, r1, l2, r2,分别表示此次询问的两个区间,注意字符串的位置从1开始编号。
    其中 1 ≤ length(S), m ≤ 1000000

    输出格式

    对于每次询问,输出一行表示结果。如果两只兔子完全相同输出 Yes,否则输出 No(注意大小写)

    样例输入

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

    样例输出

    Yes
    No
    Yes

    题解

    又是一道字符串hash模板题
    对于题目所给的字符串,我们可以先预处理出每一位的hash值与每一位的权值
    处理每一位的权值是为了通过四则运算使用类似与在一个hash值后直接补0的方式(O(1))地求出另一个hash值
    对于每一个询问我们可以运用前缀和的思想比较子串的hash值是否相等
    注意:感觉这道题好像用long long 取模不行会WA,最后我用的unsigned long long 自然溢出,亲测

    #include<bits/stdc++.h>
    #define in(i) (i=read())
    using namespace std;
    typedef unsigned long long lol;
    const lol base=131,mod=1e9+7;
    lol read() {
        lol ans=0,f=1; char i=getchar();
        while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
        while(i>='0' && i<='9') {ans=(ans<<1)+(ans<<3)+i-'0'; i=getchar();}
        return ans*f;
    }
    lol n,m;
    char s[1000010];
    lol h[1000010],sum[1000010];
    int main()
    {
        scanf("%s",s+1); in(m);
        n=strlen(s+1); sum[0]=1;
        for(int i=1;i<=n;i++) {
            h[i]=h[i-1]*base+(s[i]-'a'+1);
            sum[i]=sum[i-1]*base;
        }
        while(m--) {
            int l1,r1,l2,r2;
            in(l1); in(r1); in(l2); in(r2);
            if(h[r1]-h[l1-1]*sum[r1-l1+1]==
               h[r2]-h[l2-1]*sum[r2-l2+1])
                puts("Yes");
            else puts("No");
        }
        return 0;
    }
    

    博主蒟蒻,随意转载.但必须附上原文链接

    http://www.cnblogs.com/real-l/

  • 相关阅读:
    173. Binary Search Tree Iterator
    199. Binary Tree Right Side View
    230. Kth Smallest Element in a BST
    236. Lowest Common Ancestor of a Binary Tree
    337. House Robber III
    449. Serialize and Deserialize BST
    508. Most Frequent Subtree Sum
    513. Find Bottom Left Tree Value
    129. Sum Root to Leaf Numbers
    652. Find Duplicate Subtrees
  • 原文地址:https://www.cnblogs.com/real-l/p/9362467.html
Copyright © 2011-2022 走看看