解析

自己对PAM的理解不够深刻。

最优方案必然是先选择一个偶回文串,递归构造出它的一半。花一步逆序,然后暴力解决剩下的。
这似乎已经依稀出现了某种dp的思路。
考虑如何更好的转移。设计 transxtrans_xtransx​ 表示长度不超过 xxx 一半的最长回文后缀,可以用类似 fail 指针的方法获得。
那么dp就分别尝试从后缀树上和 trans 转移即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
const int N=3e5+100;
const int mod=19930726;
int n;
int lst=1,tot=1;
int len[N],fa[N],tr[N][4],dp[N],trans[N],ans;
char s[N];
map<char,int>mp;
inline void init(){len[0]=0;len[1]=-1;fa[0]=1;fa[1]=0;//trans[0]=1;for(int i=0;i<=tot;i++){for(int j=0;j<=3;j++) tr[i][j]=0;}tot=1;lst=1;ans=n;return;
}
inline int find(int x,int i){while(s[i-len[x]-1]!=s[i]) x=fa[x];return x;
}
inline void ins(int c,int id){lst=find(lst,id);if(!tr[lst][c]){int cur=++tot;len[cur]=len[lst]+2;fa[cur]=tr[find(fa[lst],id)][c];tr[lst][c]=cur;if(len[cur]<=2) trans[cur]=fa[cur];else{int o=trans[lst];while(s[id-len[o]-1]!=s[id]||len[o]+2>len[cur]/2)o=fa[o];//printf("%d\n",o);trans[cur]=tr[o][c];}}lst=tr[lst][c];return;
}
int q[N],st,ed;
void work(){scanf(" %s",s+1);n=strlen(s+1);    init();for(int i=1;i<=n;i++) ins(mp[s[i]],i);for(int i=2;i<=tot;i++) dp[i]=len[i];st=1,ed=0;q[++ed]=0;while(st<=ed){int now=q[st++];ans=min(ans,n-len[now]+dp[now]);dp[0]=1;for(int j=0;j<=3;j++){int to=tr[now][j];if(!to) continue;dp[to]=min(dp[now]+1,dp[trans[to]]+len[to]/2-len[trans[to]]+1);q[++ed]=to;}// printf("now=%d len=%d trans=%d dp=%d\n",now,len[now],trans[now],dp[now]);}//for(int i=0;i<=tot;i++){//     printf("i=%d A:%d T:%d C:%d G:%d len=%d fa=%d trans=%d dp=%d\n",i,tr[i][0],tr[i][1],tr[i][2],tr[i][3],len[i],fa[i],trans[i],dp[i]);//}printf("%d\n",ans);
}
signed main(){#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);#endifmp['A']=0;mp['T']=1;mp['C']=2;mp['G']=3;int T=read();while(T--) work();return 0;
}
/*
1
AAGGGGAAGGGGAA
*/

洛谷P4762: [CERC2014]Virus synthesis(PAM)相关推荐

  1. BZOJ4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)

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

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

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

  3. 洛谷P4766 [CERC2014]Outer space invaders题解

    https://www.luogu.com.cn/problem/P4766 description: 有 nnn 个外星人进攻,第 iii 个进攻的外星人会在时间 aia_iai​ 出现,距离你的距 ...

  4. bzoj4044 [Cerc2014] Virus synthesis

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

  5. bzoj 4044: [Cerc2014] Virus synthesis 回文树

    题意 你要用ATGC四个字母用两种操作拼出给定的串: 1.将其中一个字符放在已有串开头或者结尾 2.将已有串复制,然后reverse,再接在已有串的头部或者尾部 一开始已有串为空.求最少操作次数. l ...

  6. 2019.6.7 一场搜索专题的考试【including 洛谷·血色先锋队,入门OJ·兴建高铁,珠光宝气阁

    这次分数还好.但全是搜索题还没上200就有点打击人了--[本狸才177QAQ 血色先锋队/血色敢死队 传送门:洛谷P1332 & 入门OJ P2259 Description 邪魔天国领主复活 ...

  7. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  8. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  9. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

最新文章

  1. php怎么写获取手机剪切板到搜索栏,如何根据指定的剪切板获取html?
  2. antlr idea 入门_ANTLR:入门
  3. [Windows]7种网络编程I/O模型代码实现实例
  4. 荣耀20 Pro三色渲染图曝光:后置潜望式镜头+3D ToF镜头
  5. 二十四节气之大雪|PNG免扣素材,设计好素材
  6. linux下时间编程,Linux下的时间操作编程
  7. Eclipse中在refernced Libraries里面加jar包与在WEB-INF/lib下加jar包的区别
  8. 云服务器怎么多人进去编辑文档,服务器如何设置多人登陆
  9. Java并发包的理解
  10. 【Hadoop】Hadoop大数据架构及关键组件
  11. edius隐藏快捷键_edius8常用快捷键有哪些|edius快捷键使用大全汇总 - 软件教程 - 格子啦...
  12. docker安装gamit_科学网-基于Ubuntu18.04安装Gamit10.71-郭若成的博文
  13. hiberfil.sys和swapfile.sys文件的删除
  14. win10电脑插入U盘提示文件或目录损坏了如何解决
  15. SaaS营销网站的组织结构
  16. 苹果开发者中心如何上传构建版本
  17. 什么电子邮箱最安全,什么邮箱更具私密性?
  18. 护腰暖腹的好伙伴,让腰部远离寒风侵袭
  19. POJ 【1088】 滑雪
  20. 苹果官网下架iPhone 8;破解百度网盘的Pandownload开发者被捕;三大运营商年内上线5G消息 | EA周报...

热门文章

  1. rowspan 动态变化_使用colspan和rowspan动态删除html表中的多个列
  2. 二维数组各行分别求和_【PyTorch入门】之十分钟看懂二维卷积层的运算、实现及应用...
  3. python qt信号在qml 的使用_QML与Python通信
  4. 终端如何粘贴快捷键_11 个“原来可以这样”的 Linux 终端命令
  5. ci mysql高并发_高并发访问mysql时的问题(一):库存超减
  6. 自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程
  7. win10 mysql my.cnf_MySQL配置文件无法修改的解决方法(Win10)
  8. sql不等于0怎么表示_数组真的只能从0开始吗?python表示不同意
  9. Excel学习使用教程
  10. 二叉树最近公共祖先相关题目(Leetcode题解-Python语言)