回文自动机学习小记

前言

比manacher多了许多功能。
作为自动机,它能够识别所有回文子串。

构造

类似后缀自动机、AC自动机一样,回文自动机也有fail指针。
而且,回文自动机是一种每次往两端加字符的神奇trie(不知所措)。
对于自动机内一点所代表的回文串,其fail指针指向的点所代表的回文串是该回文串的最长回文后缀。
首先有两个根节点0和1,0代表空,1代表一种神奇的字符叫做被吞了一个(奥妙重重),用len表示一个结点所代表的回文串的长度,那么len[1]=-1(等会再解释,先上车)。pre[0]=1,pre[1]=1。
首先类似后缀自动机有一个last,每次在原串s后插入一个新字符ch,都从last出发,不断沿pre跳,直至找到一个x满足s[i-len[x]-1]=s[i],那么得到新的回文串,我们看x有没有ch儿子,没有就新建一个,对新建结点当然也要找到其pre,只要再从x出发往上找合法点即可(从x开始跳这里不包括x,也可以理解为从pre[x]开始跳)。可以证明,找到的这个合法点一定存在ch儿子。
不管有没有新建点,最后x的ch儿子size(或称之为cnt,反正就是表示这个回文串的出现次数)加一。
最后倒推size[pre[i]]+=size[i]即可。
然后我们发现,len[1]=-1恰到好处。s[i-(-1)-1]=s[i],相当于新增加了一个单个字符回文串。
还有注意,pre不能连向1,但由于初始空儿子设为0,那么不用进行特判。
例题:[APIO2014][jzoj3654]回文串,[JSOI2013][jzoj3291]快乐的JYY。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值