设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. django2.0 + python3.6 在centos7 下部署生产环境的一些注意事项

    一:mysql 与环境选用的坑 目前, 在生产环境部署django有三种方式: 1. apache + mod_wsgi 2. nginx + uwsigi 3. nginx + supervisor ...

  2. OO第5-7次作业总结

    前三次作业可以说是入门编程,随着课程的深入,这三次多线程作业使我们开始慢慢接触工程性的编程任务. 对比起1-3次作业,5-7次作业明显没有那么顺利了,之前在互测环节每次最多就一个BUG或者没有BUG, ...

  3. python语法之函数1

    函数 计算机中的函数和数学中的函数不是一回事,而是一个subroutine .子程序.procedures.过程. 作用: 1.减少重复代码: 2.方便修改,更易扩展: 3.保持代码的一致性. 最简单 ...

  4. 《Linux就该这么学》第十八天课程

    1.使用MariaDB数据库管理系统 今天没什么笔记,就不发了.想深入学习的可以前往原创地址:https://www.linuxprobe.com/chapter-18.html 图18-1 Mari ...

  5. dedecms mvc 开发

    目录结构说明: |_app    |___control      控制器(C)    |___model        模型(M)    |___templates    视图模板(V)    |_ ...

  6. SQL给数据编号

    方法:ROW_NUMBER() over(order by getdate()) AS num 使用案例 : select * From (select  ROW_NUMBER() over(orde ...

  7. POM文件详解(2)

    1      项目构建 <!-- 构建项目需要的信息 --> <build> <!-- 子项目可以引用的默认插件信息.该插件配置项直到被引用时才会被解析或绑定到生命周期. ...

  8. Openvswitch手册(5): VLAN and Bonding

    我们这一节来看Port 一般来说一个Port就是一个Interface,当然也有一个Port对应多个Interface的情况,成为Bond VLAN Configuration Port的一个重要的方 ...

  9. Akka-CQRS(1)- Write-side, Persisting event sources:CQRS存写端操作方式

    上篇我们提到CQRS是一种读写分离式高并发.大流量数据录入体系,其中存写部分是通过event-sourcing+akka-persistence实现的.也可以这样理解:event-sourcing(事 ...

  10. java责任链模式及项目实际运用

    1.前言 上次我们认识了java责任链模式的设计,那么接下来将给大家展示责任链模式项目中的实际运用.如何快速搭建责任链模式的项目中运用. 2.简单技术准备 我们要在项目中使用借助这样的几个知识的组合运 ...