博客
关于我
字符串哈希-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/

    你可能感兴趣的文章
    Oracle 11g 单实例安装文档
    查看>>
    Oracle 11g 操作ASM权限问题
    查看>>
    Oracle 11g 数据类型
    查看>>
    Oracle 11g 编译使用BBED
    查看>>
    oracle 11g 静默安装
    查看>>
    Oracle 11gR2学习之二(创建数据库及OEM管理篇)
    查看>>
    Oracle 11gR2构建RAC之(2)--配置共享存储
    查看>>
    Oracle 11g中的snapshot standby特性
    查看>>
    Oracle 11g关闭用户连接审计
    查看>>
    Oracle 11g忘记sys、system、scott密码该这样修改!
    查看>>
    Oracle 11g数据库安装和卸载教程
    查看>>
    Oracle 11g数据库成功安装创建详细步骤
    查看>>
    Oracle 11g超详细安装步骤
    查看>>
    Oracle 12c中的MGMTDB
    查看>>
    Oracle 12c安装报错Installation failed to access the temporary location(无法访问临时位置)...
    查看>>
    Oracle 9i数据库管理教程
    查看>>
    ORACLE Active dataguard 一个latch: row cache objects BUG
    查看>>
    oracle avg、count、max、min、sum、having、any、all、nvl的用法
    查看>>
    Oracle BEQ方式连接配置
    查看>>
    oracle Blob保存方式,oracle 存储过程操作blob
    查看>>