正题

题目链接:https://www.luogu.com.cn/problem/P4762


题目大意

长度为nnn的目标串,开始一个空串,可以执行以下操作

  1. 在头或者尾加一个字符
  2. 复制一个该串的逆串放在后面

求最少操作次数。


解题思路

我们可以知道答案肯定是一个回文串然后剩下的暴力加上。

我们构建一个PAMPAMPAM,然后用fif_{i}fi​表示带该回文串需要的最少次数。

对于一个节点的转移有fy=min{fx+1}f_{y}=min\{f_{x}+1\}fy​=min{fx​+1}
就是该回文串头尾各加上一个字符。

该回文串还有可能是一个双倍回文,即一个回文串在复制一个逆串后回文,那么有我们要像[SHOI2011]双倍回文这道题目一样维护一个最长的不超过该串一半的回文后缀的节点halfihalf_ihalfi​。

然后有转移
fx=min{fhalfx+1+lenx2−lenhalfx}f_{x}=min\{f_{half_x}+1+\frac{len_x}{2}-len_{half_x}\}fx​=min{fhalfx​​+1+2lenx​​−lenhalfx​​}

然后答案就是min{n−lenx+fx}min\{n-len_x+f_{x}\}min{n−lenx​+fx​}

时间复杂度O(4Tn)O(4Tn)O(4Tn)

如果用stdstdstd自带队列会比较慢需要自行卡常。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
queue<int> q;
const int N=1e5+10;
int T,n,m,half[N],f[N],ans;
int len[N],fail[N],next[N][4],cnt;
char s[N];
int z(char x){if(x=='A') return 0;if(x=='C') return 1;if(x=='G') return 2;if(x=='T') return 3;
}
int get_fail(int x,int n){while(s[n-len[x]-1]!=s[n])x=fail[x];return x;
}
void Make_PAM(){int last=0;len[1]=-1;s[0]='#';cnt=fail[0]=1;for(int i=1;i<=n;i++){int val=z(s[i]),x=get_fail(last,i);if(!next[x][val]){len[++cnt]=len[x]+2;int y=get_fail(fail[x],i);fail[cnt]=next[y][val];if(len[cnt]<=2) half[cnt]=fail[cnt];else{int z=half[x];while(s[i-len[z]-1]!=s[i]||((len[z]+2)<<1)>len[cnt])z=fail[z];half[cnt]=next[z][val];}next[x][val]=cnt;}last=next[x][val];}return;
}
void Solve(){ans=n;for(int i=2;i<=cnt;i++)f[i]=len[i];f[0]=1;q.push(0);while(!q.empty()){int x=q.front();q.pop();f[x]=min(f[x],f[half[x]]+1+len[x]/2-len[half[x]]);ans=min(ans,n-len[x]+f[x]);for(int i=0;i<4;i++){int y=next[x][i];if(!y) continue;f[y]=min(f[y],f[x]+1);q.push(y);}}return;
}
int main()
{scanf("%d",&T);while(T--){for(int i=0;i<=cnt;i++)for(int j=0;j<4;j++)next[i][j]=0;scanf("%s",s+1);n=strlen(s+1);Make_PAM();Solve();printf("%d\n",ans);}return 0;
}

P4762-[CERC2014]Virus synthesis【PAM,dp】相关推荐

  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. 洛谷P4762: [CERC2014]Virus synthesis(PAM)

    解析 自己对PAM的理解不够深刻. 最优方案必然是先选择一个偶回文串,递归构造出它的一半.花一步逆序,然后暴力解决剩下的. 这似乎已经依稀出现了某种dp的思路. 考虑如何更好的转移.设计 transx ...

  4. 【概率DP】$P2059$ 卡牌游戏

    [概率DP]P2059 卡牌游戏 链接 题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张 ...

  5. 【数位DP】恨7不成妻

    [数位DP]恨7不成妻 时间限制: 1 Sec  内存限制: 128 MB 提交: 8  解决: 4 [提交] [状态] [命题人:admin] 题目描述 单身! 依然单身! 吉哥依然单身! DS级码 ...

  6. Bailian4004 数字组合【递归+DP】

    4004:数字组合 总时间限制: 1000ms 内存限制: 65536kB 描述 有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式.如: n=5,5个数分别为1,2,3,4,5,t=5: ...

  7. UVA497 Strategic Defense Initiative【LIS+DP】

    "Commander! Commander! Please wake up commander!"     "- mmmph. What time is it?" ...

  8. Bailian2755 神奇的口袋【递归+DP】

    2755:神奇的口袋 总时间限制: 10000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得 ...

  9. poj1161Post Office【经典dp】

    题目:poj1161Post Office点击打开链接 题意:给出一条直线上的n个坐标表示村庄的位置,然后要在上面建p个邮局.村民优先选择去近的邮局.问全部村庄去邮局的最小距离和是多少? 分类:区间d ...

最新文章

  1. python爬取贴吧所有帖子-Python爬虫实例(一)爬取百度贴吧帖子中的图片
  2. 求高精度幂(java)
  3. 项目经理面试中可能遇到的问题
  4. makefile入门
  5. (课程学习笔记)Python基础学习
  6. linux学习网站分享
  7. 在.Net Core中实现一个WebSocket路由
  8. 洛谷P1085不高兴的津津
  9. currenthashmap如何实现线程安全_什么是多线程?如何实现多线程?
  10. [转] Understanding and Solving Internet Explorer Leak Patterns
  11. 计算机中是如何存储图片的,电脑如何保存图片
  12. java中如何用2位数表示日期_java – 如何解析2位数的年份日期?
  13. 计算机软件师倾斜怎么能摆正,ps中怎么把倾斜图案拉直
  14. 【解决篇】映美FP-530K+打印发票卡纸,色带安装问题
  15. ocx请确保该二进制存储在指定的路径中_模块*.ocx加载失败,请确保二进制存储在指定路径中...
  16. 计算机无法转换输入发,电脑无法切换输入法怎么办
  17. Spark数据挖掘实例1:基于 Audioscrobbler 数据集音乐推荐
  18. 升级IOS9错误解决方案:Unexpected CFBundleExecutable Key.The bundle atXXXX
  19. 端到端的语音识别模型
  20. rssi室内定位算法原理_RSSI的室内人员卡尔曼滤波定位算法

热门文章

  1. java实现数字转mac,Java Ethernet.getSourceMAC方法代码示例
  2. 用java求直角三角形的面积_JAVA 已知三角形的三个边判断 是否为直角三角形,如果是求面积!...
  3. .net 读蓝牙数据_Linux内核曝严重蓝牙漏洞,影响多个版本
  4. 7-36 社交网络图中结点的“重要性”计算 (30 分)(思路加详解)兄弟们PTA乙级题目冲起来
  5. Java手写HashSet
  6. lts安装 rust ubuntu_一起学Rust编程「1」:开发环境
  7. [Java基础]IO流小结
  8. [剑指offer]面试题34:丑数
  9. Codeforces Round #719 (Div. 3)/ Codeforces Round #720 (Div. 2)
  10. 无法载入增效工具_山东省 智能工具箱 智能工具管理 工具管理企业数字化管理...