• 【字符串】字符串多项式哈希


    这个太不好用了

    设哈希函数为多项式

    [f(s) = sumlimits_{i=1}^n x^{n-i}*s[i] ]

    这种方法称为字符串多项式哈希,优点是:方便递推、可以方便取出里面的子串。把[1..L-1]的前缀的多项式再乘以x^{R-L+1}次方,和[1..R]的前缀的多项式对应位置对齐,然后作差把前面多余的减掉。

    struct Hashcode {
    
        static const int MAXN = 1e5 + 10;
        static ull MOD[2];
        static ull BASE[2];
        static ull PBASE[MAXN][2];
    
        int len;
        ull code[2];
    
        static void init(int n) {
            MOD[0] = 998244353, MOD[1] = 1004535809;
            BASE[0] = 163, BASE[1] = 233;
            PBASE[0][0] = 1, PBASE[0][1] = 1;
            for (int i = 1; i <= n; ++i) {
                PBASE[i][0] = PBASE[i - 1][0] * BASE[0] % MOD[0];
                PBASE[i][1] = PBASE[i - 1][1] * BASE[1] % MOD[1];
            }
        }
    
        static Hashcode concat(const Hashcode &x, const Hashcode &y) {
            Hashcode res;
            res.len = x.len + y.len;
            res.code[0] = (x.code[0] * PBASE[y.len][0] + y.code[0]) % MOD[0];
            res.code[1] = (x.code[1] * PBASE[y.len][1] + y.code[1]) % MOD[1];
            return res;
        }
    
        ull getHashcode() {
            return (code[0] << 32) | code[1];
        }
    
    };
    

    假如要截取字符串的子串,则是要把对应R位置的[1,R]的多项式减去[1,L-1]的多项式乘以x^(R-L+1)次方。

  • 相关阅读:
    保存全局Crash报告&发送邮件
    手机端抓包方法
    apk反编译
    保存全局Crash报告
    一个android控件资源网站
    扩展RBAC用户角色权限设计方案
    剑指offer分块总结----------数组
    剑指offer-----合并两个排序的链表
    剑指offer-----单链表反转
    python实现输入一段英文单词后,倒叙输出
  • 原文地址:https://www.cnblogs.com/purinliang/p/14060672.html
Copyright © 2020-2023  润新知