回文自动机刷题总结

写在前面:

假如博主能成功发表这篇博文,那说明博主已经战胜了冰冻的手和冰冻的键盘

这里仍然只总结一些思路比较好的题或者一些常见的套路

双倍回文

1>

设$trans[i]$代表小于等于$PAM$节点$i$的$len$的一半的长度最大的节点

可以从$trans[fa[i]]$跳几次$fail$求出

2>

建出fail树,开桶记录某一个长度的回文串是否出现过

Antisymmetry

发现反对称与回文的差别在于对称位置相同或者恰好相反

所以便可以改动一下$getfail$的条件

但是会出现0011的情况,第三个位置极力想让长度大

所以和前两个形成了的长度为3的串,这是不合法的

所以当长度为奇数的时候应该让它继续跳下去

Virus synthesis

这道题$HZOJ$上没有,所以稍微粘贴一下题面:

初始有一个空串,利用下面的操作构造给定串 S

1、串开头或末尾加一个字符

2、串开头或末尾加一个该串的逆串

求最小化操作数

某KT:"这道题是撒比题!"

我:"..."

这种题显然是不能贪心的,所以考虑在$PAM$上$Dp$

由于最终的串一定是由$2$操作暴力进行$1$操作形成的

设$dp[i]$代表到了$i$节点的最小操作次数

不妨求出$trans$数组,那么便有转移$<1>$:

$$dp[i]=min(dp[i],dp[trans[i]]+1+len[i]/2-len[trans[i]])$$

即先暴力补全一半,再进行2操作

但是因为$PAM$的$fail$都是当前串的回文后缀

所以无法处理回文串位于复制后串的中间的情况

考虑引入另一种转移:对于$j$,假如$i$是$j$的孩子

那么便有转移$<2>$:

$$dp[i]=min(dp[i],dp[j]+1)$$

即在$j$复制之前加入$i$缺的字符,所以应该是$1$而不是$2$

本题的奇数长度回文串一定是某两个偶数回文串的中间状态,

或者从偶回文串到答案串的中间状态,所以不需要进行$dp$

最后为了保证转移的有序性,需要$bfs$来$dp$

秩序魔咒

题面过长,直接上链接

两个串的公共回文串,考虑对两个串的$PAM$同时进行$dfs$

求出的长度便可以更新答案

比较好的一个思路,值得积累

另外JSOI2013快乐的JYY和这道题的思路基本上是相同的

posted @ 2019-12-25 20:26  ATHOSD  阅读(195)  评论(2编辑  收藏  举报