zoukankan      html  css  js  c++  java
  • 回文自动机刷题总结

    写在前面:

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

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

    双倍回文

    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和这道题的思路基本上是相同的

  • 相关阅读:
    NodeJS优缺点
    移动端触摸相关事件touch、tap、swipe
    vscode使用技巧
    js 字符串转数字
    js 导出Excel
    <!--[if IE 9]> <![endif]-->
    js 异步请求
    关于windows串口处理
    mfc 托盘提示信息添加
    微软的麦克风处理示列代码
  • 原文地址:https://www.cnblogs.com/AthosD/p/12098735.html
Copyright © 2011-2022 走看看