博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ4044 : [Cerc2014] Virus synthesis
阅读量:7168 次
发布时间:2019-06-29

本文共 855 字,大约阅读时间需要 2 分钟。

设f[x]表示得到x这个回文串的最小步数,则ans=min(n-len[x]+f[x])

边界条件f[长度为0的偶回文串]=1

因为翻转只会得到偶回文串,所以f[奇回文串]=该串的长度

对于一个偶回文串x,设y为x去掉首尾得到的串,有f[x]=f[y]+1

设y为长度不超过x的一半的x的最长回文后缀,有f[x]=len[x]/2-len[y]+f[y]+1

两种情况取个最小值即可。

对于状态的表示以及最长回文后缀的询问,用回文树支持操作即可。时间复杂度$O(n)$。

 

#include
#include
const int N=100010,S=4;int T,n,i,x,y,ans,all,son[N][S],fail[N],trans[N],f[N],len[N],text[N],last,tot,q[N],h,t;char s[N];inline int newnode(int l){ for(int i=0;i
len[y])z=fail[z]; trans[y]=son[z][w]; } son[x][w]=y; } last=son[x][w];}inline int hash(char c){ if(c=='A')return 0; if(c=='T')return 1; if(c=='C')return 2; return 3;}inline void up(int&a,int b){if(a>b)a=b;}int main(){ for(scanf("%d",&T);T--;printf("%d\n",ans)){ scanf("%s",s+1),ans=n=std::strlen(s+1); for(init(),i=1;i<=n;i++)add(hash(s[i])); for(i=2;i

  

转载地址:http://xsmwm.baihongyu.com/

你可能感兴趣的文章
es6 Set和map数据结构
查看>>
数字键盘三
查看>>
12个值得关注的顶级JS库
查看>>
线程安全的CopyOnWriteArrayList介绍
查看>>
Java并发编程(一)Thread详解
查看>>
RealEvo 安装问题浅析
查看>>
Java并发核心-exchanger
查看>>
mysql数据迁移之<存储过程>
查看>>
5、前后端分离跨域问题
查看>>
spring结合mybatis不用手动关闭sqlSession 原理
查看>>
XSS攻击
查看>>
程序员如何做好应聘?简历、面试和Offer
查看>>
调试Linux内核操作指南(withing kgdb)
查看>>
LDA线性判别分析原理
查看>>
上海交通大学副教授何建平:网络系统中的数据隐私—量化、分析和设计
查看>>
数据库初探(二)
查看>>
docker离线安装
查看>>
CAD转换为图片可以设置哪些格式
查看>>
orcl 自定义排序
查看>>
AES加密解密算法简介
查看>>