首页 > 其他分享 >回文结构 manacher & PAM 马拉车 & 回文树

回文结构 manacher & PAM 马拉车 & 回文树

时间:2024-07-23 22:06:39浏览次数:14  
标签:ch int manacher 回文结构 siz fail PAM dp 回文

manacher

马拉车通过在每个字符间插入一个特殊字符,使得字符串长度为奇数,从而保证每个字符都有中心。在每个中心记录回文串的长度。
马拉车的扩展方式和\(Z\)函数类似。都是通过映射之前已经算过的位置,然后尽可能的向右扩展。复杂度\(O(n)\)
通常马拉车的题目统计回文串需要与其他数据结构结合,如线段树,树状数组等。需要一定的基本功。

void manacher(char* str,int n) {
    int ans = 0, t = 0;
    for (int i = 1; i <= n; ++i) {
        if (t + f[t] >= i)f[i] = min(f[t - (i - t)], t + f[t] - i);
        while (i - f[i] - 1 > 0 && i + f[i] + 1 <= n && str[i - f[i] - 1] == str[i + f[i] + 1])f[i]++;
        if (f[i] + i > f[t] + t)t = i;
        ans = max(ans, f[i]);
    }
    printf("%d", ans);
}

例题:
luogu: P3805 【模板】manacher

luogu: P1659 [国家集训队] 拉拉队排练

CF:17 E. Palisection

luogu: P4555 [国家集训队] 最长双回文串

luogu: P4287 [SHOI2011] 双倍回文

CF:30 E. Tricky and Clever Password

HDU: 7403 完美子串

回文树

回文树分为奇根和偶根,偶根的 \(fail\) 指针指向奇根,而我们并不关心奇根的 \(fail\) 指针,因为奇根不可能失配。
回文树不再考虑回文中心,是以右边界为这个回文串的终点。\(fail\) 指针指向的这个右边界更短的回文串。

回文树的构建与SAM类似,找上一个回文,依次遍历\(fail\)找对应相同的字符的位置向右扩展即可。

struct PAM {
    int siz, tot, lst;  //siz回文树大小,tot字符串处理到第几个
    int cnt[MAXN], ch[MAXN][26], len[MAXN], fail[MAXN];
    char s[MAXN];
    PAM() { clear(); }
    int node(int l) {  // 建立一个新节点,长度为 l
        siz++;
        memset(ch[siz], 0, sizeof(ch[siz]));
        len[siz] = l;
        fail[siz] = cnt[siz] = 0;
        return siz;
    }
    void clear() {
        siz = -1;
        lst = 0;
        s[tot = 0] = '$';
        node(0);
        node(-1);
        fail[0] = 1;
    }
    int getfail(int x) {  // 找后缀回文
        while (s[tot - len[x] - 1] ^ s[tot])x = fail[x];
        return x;
    }
    void insert(char c) {
        s[++tot] = c;
        int cur = getfail(lst);
        if (!ch[cur][c - 'a']) {
            int x = node(len[cur] + 2);
            fail[x] = ch[getfail(fail[cur])][c - 'a'];  //没有儿子默认指向偶根,偶根一直指向奇根
            ch[cur][c - 'a'] = x;
        }
        lst = ch[cur][c - 'a'];
        cnt[lst]++;
    }
};

最小回文划分

考虑\(dp[i]\)是\(s\)的前\(i\)位的最小划分数。考虑转移。

\[dp[i] = \underset{s[j+1,i]为回文串}{min} dp[j] + 1 \]

考虑回文串\(t\)是回文串\(s\)的后缀,那么\(t\)就是\(s\)的\(border\)。这是充分必要的。我们在kmp中有介绍\(border\)的性质。我们可以把\(s\)分为\(log|s|\)段,每一段的\(border\)都是等差数列。有了这个性质我们考虑优化dp。

优化
  • \(diff[u]\)代表\(u\)和\(fail[u]\)所代表的回文串长度差。

  • \(slink[u]\)代表这个\(border\)等差数列的最前面的位置。即第一个$diff[v] \neq diff[u] $

  • \(g[u]\)是这个\(border\)等差数列的长度对应的\(dp\)最小值。

复杂度\(O(nlogn)\)

for (int i = 1; i <= n; ++i) {
    p.insert(s[i]);
    for (int x = p.lst; x > 1; x = p.slink[x]) {
        g[x] = dp[i - p.len[p.slink[x]] - p.dif[x]];
        if (p.dif[x] == p.dif[p.fail[x]])g[x] = min(g[x], g[p.fail[x]]);
        dp[i] = min(dp[i], g[x] + 1);
    }
}

双倍回文

寻找最长的\(ww^Rww^R\)形式字符串。

  • 维护一个\(trans\)小于等于当前节点长度一半的最长回文后缀,和\(fail\)求法类似。即可。

例题:
luogu: P5496 【模板】回文自动机(PAM)

其他方式处理回文

哈希、SA、SAM都可以用,思路都是把原串翻转。求这部分和反转后的这部分是否一致。

哈希可以快速判断某子串是否是回文串。SA和SAM考虑两个串匹配的长度和对应的位置差距可以判断是否为回文串。

标签:ch,int,manacher,回文结构,siz,fail,PAM,dp,回文
From: https://www.cnblogs.com/Qing17/p/18319756

相关文章

  • AbMole| Rapamycin, Y27632和SCH772984揭示EGFR-TKIs耐药机制
     AbMole(奥默生物)是ChemBridge在中国的唯一官方指定合作伙伴。由中国药科大学基础医学与临床药学学院的ZhenZhenPan,KaiWang,XiNiaoWang, XuanShengDing以及广州医科大学附属第五医院的JianYeZhang等多名研究人员在MolCancer.期刊(IF=37.3)上,发表了题为“Cholesterolprom......
  • P3805 【模板】manacher
    原题链接题解细节所有字符的回文半径初始化为1rmax=1ans=1code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;voidsolve(){strings;cin>>s;strings1;for(inti=0;s[i];i++){s1+='#';s1+=......
  • 题解:CodeForces 835 D Palindromic characteristics[区间dp/马拉车Manacher]
    CodeForces835DD.Palindromiccharacteristicstimelimitpertest:3secondsmemorylimitpertest:256megabytes*inputstandardinputoutputstandardoutputPalindromiccharacteristicsofstring\(s\)withlength\(|s|\)isasequenceof\(|s|\)in......
  • Cilium LB IPAM概念(转载)
    CiliumLBIPAM概念一、环境信息主机IPubuntu172.16.94.141软件版本docker26.1.4helmv3.15.0-rc.2kind0.18.0kubernetes1.23.4ubuntuosUbuntu20.04.6LTSkernel5.11.5内核升级文档二、CiliumLBIPAM概念说明参考官方文档......
  • 「字符串」Manacher算法(马拉车)/ LeetCode 05(C++)
    给你一个字符串 s,找到 s 中最长的回文子串。示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb"思路我们回想中心扩散法:某字符处的中心扩散完毕后,其实已经将它身前身后的字符段落都搜索过了,那么如果我们搜索其后的字......
  • TPAMI 2024 | 压缩SDR到HDR视频重构
    题目:Compressed-SDRtoHDRVideoReconstruction压缩SDR到HDR视频重构作者:HuWang;MaoYe;XiatianZhu;ShuaiLi;XueLi;CeZhu源码链接:https://wanghu178.github.io/KPNet/摘要新一代的有机发光二极管(OLED)显示器设计用于支持高动态范围(HDR),超越了传统显示......
  • TPAMI 2024 | MixFormer: 基于迭代混合注意力的端到端跟踪
    题目:MixFormer:End-to-EndTrackingWithIterativeMixedAttentionMixFormer:基于迭代混合注意力的端到端跟踪作者:Y.Cui;C.Jiang;G.Wu;L.Wang摘要视觉目标跟踪通常采用多阶段流水线,包括特征提取、目标信息集成和边界框估计。为了简化这一流程并统一特征提......
  • Manacher学习笔记
    1.用途给定一个串,求该串中最长回文子串的长度2.算法过程2.1.预处理回文串分为两类,奇回文和偶回文,所以对称中点是不确定的,可能是字符也可能是两个字符之间的空隙所以可以在任意两个字符和开头结尾加上同一个奇怪的字符,此时的回文中心就一定是一个字符2.2.算法主体定义数......
  • Manacher
    1问题引入给定一个长度为\(n\)的字符串\(s\),请找出该字符串中所有的回文子串。显然对于一个长度为\(n\)的字符串,其回文子串至多有\(n^2\)个,因此如果一个个统计复杂度必定不会优秀。那如何优化复杂度呢?这就要提到Manacher算法了。在探讨这个算法之前,我们需要先了解其......
  • 通信原理抽样定理和PAM调制解调硬件实验
    一、实验目的1.加深理解抽样定理;2.加深理解脉冲幅度调制的原理。二、实验内容1. 观测PAM平顶抽样波形;2. 观测PAM自然抽样波形及解码后波形。三、实验器材1.双踪示波器;2.通信原理实验箱信号源模块、①号模块。四、实验步骤1.观测PAM平顶抽样波形(1)用示波器观测......