设f[i]为形成极长回文串i的最小操作数。答案为min f[i]+n-len[i]。

在不形成偶回文的情况下形成奇回文的最小操作数为该串长度。可以不考虑(但ans赋为len)。

正确性基于:

1)奇、偶回文嵌套形成最终的偶回文一定可以转化为由在不形成奇回文的情况下形成偶回文。

2)奇、偶回文嵌套形成最终的奇回文并不需要讨论。

也不知道理解对没有。。。

所以,以下的回文串皆代指偶回文。

转移1:f[i]=f[j]+1 | 在极长回文串j前后补上一对相同字符可得到i。

举例:

aabbaa : a aa aab aabbaa

caabbaac: a aa aab caab caabbaac

统一化:f[偶根]=1 => f["aa"]=2

转移2:f[i]=min f[j]+1+len[i]/2-len[j] | j=tmp[i].

举例:

abba : a ab abba

abbaccabba: abba abbac abbaccabba

#include <bits/stdc++.h>
using namespace std;
const int N=3e5+10; map<char,int> tr={
{'A',0},{'G',1},{'C',2},{'T',3}
}; struct pam_ {
char *str;
int last,size;
int tmp[N],len[N],fail[N],ch[N][26];
int getFail(int x,int n) {
while(str[n]!=str[n-len[x]-1]) x=fail[x];
return x;
}
void build(char *bStr) {
str=bStr;
str[0]=-1;
len[1]=-1;
fail[0]=1;
last=0;
size=1;
memset(ch[0],0,sizeof ch[0]);
memset(ch[1],0,sizeof ch[1]);
for(int i=1; str[i]; ++i) {
int c=tr[str[i]];
int p=getFail(last,i);
if(!ch[p][c]) {
int q=++size;
memset(ch[q],0,sizeof ch[q]);
len[q]=len[p]+2;
fail[q]=ch[getFail(fail[p],i)][c];
ch[p][c]=q;
if(len[q]<=2) tmp[q]=fail[q];
else {
int x=tmp[p];
while(str[i]!=str[i-len[x]-1]||(len[x]+2)*2>len[q]) x=fail[x];
tmp[q]=ch[x][c];
}
}
last=ch[p][c];
}
}
int calc() {
static int que[N];
static int f[N];
int n,ans,hd,tl;
n=ans=strlen(str+1);
que[hd=0,tl=1]=0;
for(int i=2; i<=size; ++i) {
f[i]=len[i];
}
f[0]=1,f[1]=0;
while(hd<tl) {
int x=que[++hd];
for(int i=0; i<4; ++i) {
int y=ch[x][i];
if(!y) continue;
f[y]=f[x]+1;
que[++tl]=y;
f[y]=min(f[y],f[tmp[y]]+1+len[y]/2-len[tmp[y]]);
ans=min(ans,f[y]+n-len[y]);
}
}
return ans;
}
} pam; int main() {
int T;
scanf("%d",&T);
static char str[N];
while(T--) {
scanf("%s",str+1);
pam.build(str);
// puts("built");
printf("%d\n",pam.calc());
}
return 0;
}

[CERC2014] Virus synthesis的更多相关文章

  1. luogu_4762: [CERC2014]Virus synthesis

    洛谷_4762:[CERC2014]Virus synthesis 题目描述: 初始有一个空串,利用下面的操作构造给定串\(S\).\(len(S)\leq10^5\) 1: 串开头或末尾加一个字符. ...

  2. [CERC2014]Virus synthesis【回文自动机+DP】

    [CERC2014]Virus synthesis 初始有一个空串,利用下面的操作构造给定串 SS . 1.串开头或末尾加一个字符 2.串开头或末尾加一个该串的逆串 求最小化操作数, \(|S| \l ...

  3. bzoj4044/luoguP4762 [Cerc2014]Virus synthesis(回文自动机+dp)

    bzoj4044/luoguP4762 [Cerc2014]Virus synthesis(回文自动机+dp) bzoj Luogu 你要用ATGC四个字母用两种操作拼出给定的串: 1.将其中一个字符 ...

  4. bzoj4044 [Cerc2014] Virus synthesis

    回文自动机上dp f[x]表示形成x代表的回文串所需的最小步数, 若len[x]为奇数,f[x]=len[x],因为即使有更优的,也是直接添加,没有复制操作,那样就不用从x转移了. 若len[x]为偶 ...

  5. 洛谷P4762 [CERC2014]Virus synthesis(回文自动机+dp)

    传送门 回文自动机的好题啊 先建一个回文自动机,然后记$dp[i]$表示转移到$i$节点代表的回文串的最少的需要次数 首先肯定2操作越多越好,经过2操作之后的串必定是一个回文串,所以最后的答案肯定是由 ...

  6. bzoj 4044: [Cerc2014] Virus synthesis【回文自动机+dp】

    建回文自动机,注意到一个回文串是可以通过一个长度小于等于这个串长度的一半的回文串添上一些字符然后复制得到的,也就是在自动机上向fa走,相当于treedp 每次都走显然会T,记录一个up,指向祖先中最下 ...

  7. BZOJ 4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)

    好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...

  8. BZOJ4044: [Cerc2014] Virus synthesis(回文树+DP)

    Description Viruses are usually bad for your health. How about fighting them with... other viruses? ...

  9. P4762 [CERC2014]Virus synthesis

    题意 真是道回文自动机好题. 首先考虑答案必定是一个回文串+剩余部分的形式,因此可以建出回文自动机,之后考虑每个长度为偶数的回文串. 对于一个长度为偶数的回文串,设它在回文自动机上对应的节点为\(x\ ...

随机推荐

  1. 用turtle库实现汉诺塔问题~~~~~

    汉诺塔问题 问题描述和背景: 汉诺塔是学习"递归"的经典入门案例,该案例来源于真实故事.‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬ ...

  2. python中print不换行

    python中的print打印的结果总是进行了换行,如果不想换行显示可以在print中添加“end ='' ” 一般print显示: for i in range(3): print(i) #显示结果 ...

  3. Filter笔记

    1.Filter [1] Filter简介 > Filter翻译为中文是过滤器的意思. > Filter是JavaWeb的三大web组件之一:Servlet.Filter.Listener ...

  4. 用STS构建spring boot

    操作步骤:1. 登录地址http://spring.io/tools 下载sts,spring-tool-suite-3.9.5.RELEASE-e4.8.0-win32-x86_64.zip2. 解 ...

  5. 不能ping通主机名

    https://www.linuxidc.com/Linux/2017-03/142253.htm sudo apt-get install winbind , sudo apt-get instal ...

  6. Mac OS mysql数据库安装与初始化

    一.官网下载mysql 二.安装并启用 三.数据库初始化 192:bin zhuyajing$ ./mysql -u root -p Enter password: Welcome to the My ...

  7. python 基础———— 字符串常用的调用 (图)

    Python 常用的 字符串调用方法 这里用到了pycharm ( 使用Python  有力的工具) 下载地址https://www.jetbrains.com/pycharm/download/#s ...

  8. mybatis递归查询

    <!--mybatis递归查询--><resultMap id="recursionMenuMap" type="AgentMenu" ext ...

  9. jquery学习总结12-24

    一.jquery操作类的相关方法 1.addClass()方法可以为DOM元素添加类,若添加多个类中间可以用空格连接 2.removeClass()方法可以为DOM元素删除类,若删除多个类中间可以用空 ...

  10. Linux学习---内存分布基础

    内核空间 应用程序不允许访问 -----------------------------------------3G 栈空间 局部变量 RW ----------------------------- ...