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

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

设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

  

转载于:https://www.cnblogs.com/clrs97/p/4700658.html

你可能感兴趣的文章
qdtuling.xyz 7.8
查看>>
Java工程师成神之路
查看>>
【canvas】先绘制标准图形,在进行图形变换
查看>>
两个命令:hdparm和iozone参数解释
查看>>
angular设置全局变量,修改监听变量
查看>>
alter column和modify column
查看>>
线性代数矩阵知识
查看>>
uni-app教程入门视频资料
查看>>
PHP 语法
查看>>
java程序在linux上持续运行方法 nohup 和 tmux
查看>>
Tomcat组件梳理—Service组件
查看>>
图解 HTTP 笔记(二)——简单的 HTTP 协议
查看>>
AcWing:173. 矩阵距离(bfs)
查看>>
C# 正则表达式
查看>>
Spring Cloud 入门教程(四): 分布式环境下自动发现配置服务
查看>>
Spring Cloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务
查看>>
Spring Cloud 入门教程(一): 服务注册
查看>>
【2.2】创建博客文章模型
查看>>
【3.1】Cookiecutter安装和使用
查看>>
【2.3】初始Django Shell
查看>>