当前位置: 首页 > news >正文

回文自动机(PAM)

回文自动机一般用于解决字符串中的回文问题,当马拉车无法很好的解决问题时,自由度更高的回文自动机便成为了首选。

回文自动机跟 AC 自动机有点相似,它同样要建立出一个“回文树”,我们来具体介绍一下这个“回文树”:

回文串分奇偶两种,因此,我们把 PAM 的状态分成两个部分,一部分存奇回文串,另一部分存偶回文串。

同理,我们把根也分为奇根(图中的点 1)和偶根(图中的点 0)。它们不表示任何字符串,只作为初始状态而存在。

树上除了根以外的任意一个点都代表一个回文串,我们从这个点一直读到根,再读回到这个点,即为其代表的回文串。

特别的,如果是奇回文串,则与根相连的那个字符边只读一次。

如图,\(s="abcabc"\) 建出的 PAM 如下图:

我们举几个例子:

点 4 代表的回文串是 \(aba\)。点 7 代表的回文串是 \(c\)。点 6 代表的回文串是 \(baab\)

当然,这个树上也有 fail 指针,我们参考下图理解:

这个是 \(abbaabba\) 的回文树。

我们举个例:

点 8 代表的串是 \(bbaabb\),当它失配时,我们跳到点 4,也就是 \(bb\)

如果此时我们加入的字符是 \(a\),发现可以组成 \(abba\) 这一个回文串,我们就配对即可。

因此我们发现,我们 getfail 的条件就是 s[i-lenB[x]-1]!=s[i],满足这个时我们就可以不用继续往 fail 跳了,当然有可能出现 i-lenB[x]-1<=0 的情况,这种情况下我们还要继续跳。

我们引入一个性质:一个串的本质不同的回文子串最多有 \(n\) 个,也就可以推出我们加入一个点时最多只会产生一个新的回文串。

然后就是和 AC 自动机一样的操作,不存在就建立点,存在就直接走。

那我们剩下的唯一一个问题就是,在新建点时要怎么操作?

我们先考虑这个点的 fail 应该连向哪里,我们肯定得在 fail[pos] 找,然后我们发现为了满足添加了这一个字母以后其依然是一个回文串,所以所要的点必然是 getfail(fail[pos],i),那我们直接 fail[++tot]=trie[getfail(fail[pos],i)][s[i]-'a'] 就可以了。

在初始化中 fail[0]=1,fail[1]=0,len[1]=-1 即可。

统计长度,我们直接 len[tot]=len[pos]+2。统计数量,我们 sum[now]++,最后 sum[fail[i]]+=sum[i] (i:2~tot) 即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned ll
string s;
ll siz,fail[2000005],len[2000005],ans,tot=1,sum[2000005];
ll tr[2000005][26];
ll getfail(ll x,ll i){while(i-len[x]-1<0||s[i-len[x]-1]!=s[i]){x=fail[x];}return x;
}
int main(){cin>>s;siz=s.size();fail[1]=0;fail[0]=1;len[0]=0;len[1]=-1;ll now=0;for(int i=0;i<siz;i++){ll mb=getfail(now,i);if(!tr[mb][s[i]-'a']){fail[++tot]=tr[getfail(fail[mb],i)][s[i]-'a'];tr[mb][s[i]-'a']=tot;len[tot]=len[mb]+2;sum[tot]=sum[fail[tot]]+1;}now=tr[mb][s[i]-'a'];}
}
http://www.jsqmd.com/news/1374405/

相关文章:

  • 业财管理步入深水区:金蝶进销存实施怎么选?主流模式与厂家对比指南
  • 2026 年 8 月实力盘点:论文写作助手哪个好用?20 款主流平台全面对比
  • 海隆兴推广UVA和UVC灯珠应用以及区别
  • 2026年08月 长沙企业财税顾问推荐|3家靠谱财税公司,助力企业财税合规 - 讲清楚了
  • 从安装到出片:MiniMax-H3-Turbo-Lora-Pruned-ComfyUI完整部署教程
  • AI编码成本优化实战:从Databricks降本70%到构建智能代理
  • 网络与请求级错误
  • 小芯片跑模型:预算有限时优先处理内存、延迟还是精度
  • YimMenu终极配置指南:3步快速解决菜单显示与保护功能设置
  • 如何为任天堂DS设备打造终极自定义菜单系统:TWiLight Menu++完全指南
  • CSS Scope Inline核心原理揭秘:MutationObserver如何实现无构建的样式作用域
  • 酵母单杂交 pHis2 系统到底怎么用?和 pAbAi 有什么区别?
  • Windows更新卡死怎么办?这个开源工具让你一键修复所有问题
  • pi-web数据库设计:会话数据存储的最佳实践指南
  • 终极Android Material Drawer Template指南:打造符合Material Design的导航抽屉
  • 如何快速上手hvmi?5分钟搭建你的第一个内存introspection环境
  • hvmi开发者指南:从零开始构建自定义内存监控插件
  • 不会绘制学术图有多吃亏?科研绘图帮你拉高论文质感 - 爱学习的肖博
  • ERD Online 5.0.0 迭代:聚焦建模复用、DDL 导出与登录体验,还有这些未来计划!
  • MASPreferences高级技巧:自定义工具栏样式与面板切换动画全攻略
  • tableView 相关 API 一览表
  • ai论文写作工具推荐!8款论文AI工具,让理工科图表和公式更配套 - AI论文先行者
  • 大数据时代,谁来守护你的“数字隐私”?
  • 2026年PET纺丝增韧剂靠谱供应商选型指南:合规与性能双维度解析 - 汇聚至此
  • 跨越八百公里游天坛,却败给了一场“逐客令”与冷脸
  • 2026 年呼伦贝尔汽车音响改装服务能力专项测评:舜驰车改汽车贴膜音响服务中心实地验证报告 - 优企甄选
  • 5分钟搞定自研HTTP/2服务!wastnet零依赖、免配置,快速搭建不是梦
  • 2026年涨缩分选机实力厂家直供解析 - 卓企推荐
  • vibecoding阶段,原型设计,好用的网站
  • 别再被坑了!上海小程序定制开发公司推荐指南 - 上海观智网络