洛谷P4762: [CERC2014]Virus synthesis(PAM)
解析
自己对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)相关推荐
- BZOJ4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)
好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...
- BZOJ 4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)
好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...
- 洛谷P4766 [CERC2014]Outer space invaders题解
https://www.luogu.com.cn/problem/P4766 description: 有 nnn 个外星人进攻,第 iii 个进攻的外星人会在时间 aia_iai 出现,距离你的距 ...
- bzoj4044 [Cerc2014] Virus synthesis
回文自动机上dp f[x]表示形成x代表的回文串所需的最小步数, 若len[x]为奇数,f[x]=len[x],因为即使有更优的,也是直接添加,没有复制操作,那样就不用从x转移了. 若len[x]为偶 ...
- bzoj 4044: [Cerc2014] Virus synthesis 回文树
题意 你要用ATGC四个字母用两种操作拼出给定的串: 1.将其中一个字符放在已有串开头或者结尾 2.将已有串复制,然后reverse,再接在已有串的头部或者尾部 一开始已有串为空.求最少操作次数. l ...
- 2019.6.7 一场搜索专题的考试【including 洛谷·血色先锋队,入门OJ·兴建高铁,珠光宝气阁
这次分数还好.但全是搜索题还没上200就有点打击人了--[本狸才177QAQ 血色先锋队/血色敢死队 传送门:洛谷P1332 & 入门OJ P2259 Description 邪魔天国领主复活 ...
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
- 洛谷 P1142 轰炸
洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...
- 洛谷 P1387 最大正方形
P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...
最新文章
- php怎么写获取手机剪切板到搜索栏,如何根据指定的剪切板获取html?
- antlr idea 入门_ANTLR:入门
- [Windows]7种网络编程I/O模型代码实现实例
- 荣耀20 Pro三色渲染图曝光:后置潜望式镜头+3D ToF镜头
- 二十四节气之大雪|PNG免扣素材,设计好素材
- linux下时间编程,Linux下的时间操作编程
- Eclipse中在refernced Libraries里面加jar包与在WEB-INF/lib下加jar包的区别
- 云服务器怎么多人进去编辑文档,服务器如何设置多人登陆
- Java并发包的理解
- 【Hadoop】Hadoop大数据架构及关键组件
- edius隐藏快捷键_edius8常用快捷键有哪些|edius快捷键使用大全汇总 - 软件教程 - 格子啦...
- docker安装gamit_科学网-基于Ubuntu18.04安装Gamit10.71-郭若成的博文
- hiberfil.sys和swapfile.sys文件的删除
- win10电脑插入U盘提示文件或目录损坏了如何解决
- SaaS营销网站的组织结构
- 苹果开发者中心如何上传构建版本
- 什么电子邮箱最安全,什么邮箱更具私密性?
- 护腰暖腹的好伙伴,让腰部远离寒风侵袭
- POJ 【1088】 滑雪
- 苹果官网下架iPhone 8;破解百度网盘的Pandownload开发者被捕;三大运营商年内上线5G消息 | EA周报...
热门文章
- rowspan 动态变化_使用colspan和rowspan动态删除html表中的多个列
- 二维数组各行分别求和_【PyTorch入门】之十分钟看懂二维卷积层的运算、实现及应用...
- python qt信号在qml 的使用_QML与Python通信
- 终端如何粘贴快捷键_11 个“原来可以这样”的 Linux 终端命令
- ci mysql高并发_高并发访问mysql时的问题(一):库存超减
- 自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程
- win10 mysql my.cnf_MySQL配置文件无法修改的解决方法(Win10)
- sql不等于0怎么表示_数组真的只能从0开始吗?python表示不同意
- Excel学习使用教程
- 二叉树最近公共祖先相关题目(Leetcode题解-Python语言)