BZOJ4044 : [Cerc2014] Virus synthesis

设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<cstdio>
#include<cstring>
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<S;i++)son[tot][i]=0;
  len[tot]=l;
  return tot++;
}
inline void init(){
  last=tot=all=0;
  newnode(0),newnode(-1);
  text[0]=-1,fail[0]=1;
}
inline int getfail(int x){
  while(text[all-len[x]-1]!=text[all])x=fail[x];
  return x;
}
inline void add(int w){
  text[++all]=w;
  int x=getfail(last);
  if(!son[x][w]){
    int y=newnode(len[x]+2);
    fail[y]=son[getfail(fail[x])][w];
    if(len[y]<=2)trans[y]=fail[y];else{
      int z=trans[x];
      while(text[all-len[z]-1]!=text[all]||(len[z]+2)*2>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<tot;i++)if(len[i]&1)f[i]=len[i];
    f[q[h=t=0]=0]=1;
    while(h<=t)for(x=q[h++],i=0;i<4;i++)if(son[x][i]){
      f[y=son[x][i]]=f[x]+1;
      up(f[y],len[y]/2-len[trans[y]]+f[trans[y]]+1);
      up(ans,n-len[y]+f[y]);
      q[++t]=y;
    }
  }
  return 0;
}

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值