回文自动机刷题总结
写在前面:
假如博主能成功发表这篇博文,那说明博主已经战胜了冰冻的手和冰冻的键盘
这里仍然只总结一些思路比较好的题或者一些常见的套路
双倍回文
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和这道题的思路基本上是相同的