博客
关于我
字符串哈希-Isomorphic Strings-CF985F
阅读量:368 次
发布时间:2019-03-04

本文共 1525 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要判断两个子串是否是等价的。具体来说,给定一个母串和多个查询,每个查询询问两个子串是否可以一一对应。我们可以使用滚动哈希技术来高效地解决这个问题。

方法思路

  • 滚动哈希预处理:我们首先预处理母串的前缀哈希值和底数幂次数组。前缀哈希数组用于快速计算任意子串的哈希值,底数幂次数组用于处理哈希值的模运算。
  • 哈希值计算:对于每个查询,计算两个子串的哈希值。哈希值相同意味着这两个子串是等价的。
  • 冲突处理:为了减少哈希冲突,我们选择了大质数作为模数,并在计算哈希值时进行适当的模运算。
  • 解决代码

    #include 
    #include
    #include
    #include
    using namespace std;#define ll long longconst int N = 2 * 100000 + 10;const int base = 131;const int mod = 19260817;int n, m;string s;ll p[N], h[N];int main() { scanf("%d %d", &n, &m); scanf("%s", s.c_str()); p[0] = 1; for (int i = 1; i <= n; ++i) { p[i] = (p[i-1] * base) % mod; } for (int i = 1; i <= n; ++i) { ll val = (s[i-1] - 'a' + 1); h[i] = (h[i-1] * base + val) % mod; } for (int i = 0; i < m; ++i) { int x, y, len; scanf("%d %d %d", &x, &y, &len); if (x + len - 1 > n || y + len - 1 > n) { printf("NO"); continue; } ll hash_a = (h[x + len - 1] - (h[x - 1] * p[len]) % mod) % mod; if (hash_a < 0) hash_a += mod; ll hash_b = (h[y + len - 1] - (h[y - 1] * p[len]) % mod) % mod; if (hash_b < 0) hash_b += mod; if (hash_a == hash_b) { printf("YES"); } else { printf("NO"); } } return 0;}

    代码解释

  • 预处理:首先读取输入并预处理底数幂次数组p和前缀哈希数组hp数组存储了底数的幂次模运算结果,h数组存储了母串前缀哈希值。
  • 查询处理:对于每个查询,计算两个子串的哈希值。如果两个哈希值相同,则输出"YES",否则输出"NO"。
  • 模运算处理:在计算哈希值时,使用适当的模运算确保结果正确,并处理负数情况。
  • 这种方法的时间复杂度为O(n)预处理和O(m)查询,能够高效处理大规模输入。

    转载地址:http://cjor.baihongyu.com/

    你可能感兴趣的文章
    Pix2Pix如何工作?
    查看>>
    QuickBI助你成为分析师——搞定数据源
    查看>>
    pkl来存储python字典
    查看>>
    quick sort | 快速排序 C++ 实现
    查看>>
    pkpmbs 建设工程质量监督系统 Ajax_operaFile.aspx 文件读取漏洞复现
    查看>>
    pkpmbs 建设工程质量监督系统 文件上传漏洞复现
    查看>>
    pku 2400 Supervisor, Supervisee KM求最小权匹配+DFS回溯解集
    查看>>
    queue队列、deque双端队列和priority_queue优先队列
    查看>>
    PKUSC2018游记
    查看>>
    PK项目测试,做产品测试有这4大优势!
    查看>>
    pl sql 的目录 所在的目录 不能有 小括号,如 Program Files (x86)
    查看>>
    PL SQLDEVELOPMENT导出数据库脚本
    查看>>
    Queue
    查看>>
    PL/SQL Developer中文版下载以及使用图解(绿色版)
    查看>>
    pl/sql developer乱码,日期格式等问题解决
    查看>>
    PL/SQL 中的if elsif 练习
    查看>>
    PL/SQL 存储函数和过程
    查看>>
    query简单入门到精通细节 - (六)Jquery效果之“淡入与淡出”
    查看>>
    PL/SQL提示“ORA-01722:无效数字,将无效数字查找出来
    查看>>
    PL/sql语法单元
    查看>>