zoukankan      html  css  js  c++  java
  • luogu P4762 [CERC2014]Virus synthesis (回文自动机)

    大意: 初始有一个空串, 操作(1)在开头或末尾添加一个字符. 操作(2)在开头或末尾添加该串的逆串. 求得到串$S$所需最少操作数.

    显然最后一定是由某个偶回文通过添加字符得到的, 那么只需要求出所有偶回文的最少操作数即可.

    结论: 偶回文最后一次进行翻倍操作一定最优.

    证明考虑数学归纳, 对于长为$2$的回文串显然成立.

    对长度$>2$的偶回文串$A$, 记最后一次翻倍得到的串$B$, $B$的一半为$C$. 

    记$f(S)$为串$S$的最优值, 就有$f(B)=f(C)+1$.

    考虑由$B$得到$A$的过程, 有$4$种情况:

    $1.$ $A=B$, 那么结论成立.

    $2.$ 同时在$B$的左端和右端添加字符. 那么$B$只能是由$A$去掉左右两端得到的串. 总操作数是$f(C)+3$, 在$C$一端添加一个字符再翻倍操作数为$f(C)+2$更优, 所以这种情况不成立.

    $3.$ 全部在$B$的左端添加字符. 那么$B$只能是$A$的最长偶回文后缀, 总操作数就为$f(C)+|A|-|B|+1$. 而在$C$的左侧添加字符然后再翻倍的操作数为$f(C)+frac{|A|}{2}-frac{|B|}{2}+1$更优, 所以不成立.

    $4.$ 全部在$B$的右端添加字符. 同情况$3.$

     

  • 相关阅读:
    hdu 1028 Ignatius and the Princess III (n的划分)
    CodeForces
    poj 3254 Corn Fields (状压DP入门)
    HYSBZ 1040 骑士 (基环外向树DP)
    PAT 1071 Speech Patterns (25)
    PAT 1077 Kuchiguse (20)
    PAT 1043 Is It a Binary Search Tree (25)
    PAT 1053 Path of Equal Weight (30)
    c++ 常用标准库
    常见数学问题
  • 原文地址:https://www.cnblogs.com/uid001/p/10960511.html
Copyright © 2011-2022 走看看