设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. [规则原则定理]规则原则定理章4 HTTP&RPC

    rpc是远端过程调用,其调用协议通常包含传输协议和序列化协议. 传输协议包含: 如著名的 [gRPC](grpc / grpc.io) 使用的 http2 协议,也有如dubbo一类的自定义报文的tc ...

  2. Docker安装nexus

    一.Nexus3安装 sudo docker search nexus sudo docker pull sonatype/nexus3 sudo docker images sudo docker ...

  3. [入门]在Mac OS X下使用和配置Android Studio

    Android Studio可谓是安卓开发的XCode,流畅的速度+顺眼的UI足以秒杀Eclipse.在Mac OS X可以通过如下的途径获得Android Studio  最新版本的Android ...

  4. 实验十五 GUI编程练习与应用程序部署

    实验十五  GUI编程练习与应用程序部署 实验时间 2018-12-6 一:理论部分 1.Java 程序的打包:编译完成后,程序员将.class 文件压缩打包为 .jar 文件后,GUI 界面序就可以 ...

  5. 20155312 张竞予 Exp9 Web安全基础

    Exp9 Web安全基础 目录 基础问题回答 (1)SQL注入攻击原理,如何防御 (2)XSS攻击的原理,如何防御 (3)CSRF攻击原理,如何防御 实践过程记录 WebGoat准备工作 1.XSS攻 ...

  6. (PMP)第2章-----项目运行环境

    1.事业环境因素:(客观存在,可能有帮助或阻碍,项目经理必须遵守) 内部:文化,结构,治理:设施和资源的地理分布,基础设施,信息技术软件,资源可用性,员工能力 外部:市场条件,社会和文化,法律限制,商 ...

  7. temp--贵州银行

    -------住宿----泊乐酒店----8905----与朱聿一起住 2018年  1月3日晚 1月4日晚  1月5日晚 1月6日晚  1月7日晚 1月8日晚  1月9日晚 已结清! ======= ...

  8. php hash_file

    string hash_file ( string $algo , string $filename [, bool $raw_output = FALSE ] ) 参数¶ algo 要使用的哈希算法 ...

  9. Jsp处理过程and数据交互

    request处理客户端请求 客户端-------------->jsp页面--------------->服务器 常用方法 1.String getParameter(String na ...

  10. How to setup Visual Studio without pain

    Visual Studio (VS) can be very hard to install. If you are lucky, one whole day may be enough to ins ...