设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. XBee模块户外通信距离测试

    Digi的XBee模块在市面上同类产品中,除了稳定性和可靠性最受推崇外,在距离测试中一般都比竞争对手的产品略胜一筹.户外测试需要注意避免模块自身以外的因素造成的测试结果不理想. 2.4G的模块有Zig ...

  2. 第四次Scrum编码冲刺!!!!

    一.总体任务: 本次冲刺是完成对图书馆管理系统的最后三个功能的实现------管理员对用户授权.用户注销和用户查询 二.个人任务及完成情况:    本人本次的任务是实现对管理员对用户授权部分的界面与部 ...

  3. linux修改用户id,组id

    一.修改用户uid usermod -u foo 二.修改用户gid groupmod -g 2005 foo usermod -g 2005 foo 三.检查 cat /etc/passwd su ...

  4. 使用mobx项目开发总结(不再更新)

      mobx的优点 1,使用@observer的组件真正实现按需更新,只有监听的数据发生变化,它才会re-render,尽管父组件发生更新,但是子组件只要有@observer,则不会触发更新,类似于实 ...

  5. Embedding层

    示例解释: model = Sequential() model.add(Embedding(1000, 64, input_length=10)) #输入中的数值最大值是1000,输出的第三维度是6 ...

  6. volatile的使用

    //资源(把 volatile去掉进行测试 )public class Demo { volatile int i =1;}//测试 public static void main(String[] ...

  7. 团队-Forward团队-团队一阶段互评

    团队名称:Forward团队 学号:2015035107105 得分:7 原因:知识欠缺,能够一边学一边做 学号:2015035107109 得分:6 原因:对我有很多帮助 学号:2015035107 ...

  8. stringstream

    C++引入了ostringstream.istringstream.stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件. istringstream类用于执行C++ ...

  9. ES6中的箭头函数和普通函数有什么区别?

    1.普通函数中的this总是指向调用它的那个对象, 箭头函数没有自己的this,他的this永远指向其定义环境,任何方法都改变不了其指向,如call().bind().apply().(正是因为它没有 ...

  10. 如何高效地写CSS--等以后有空多加总结一下

    CSS写的并不多,如果从零开始的项目,自己一定想搬砖来得容易点.CSS编写一定有其工程化的方法,来时编写更加有效率. 考虑将CSS的预处理LESS.Sass或Stylus引入,或者将CSS的后处理Po ...