博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 11475 Extend to Palindrome(后缀数组+ST表)
阅读量:5154 次
发布时间:2019-06-13

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

 

【题目链接】 

 

【题目大意】

  给出一个字符串,要求在其后面添加最少的字符数,使得其成为一个回文串。并输出这个回文串。

 

【题解】

  用拼接符将原字符串倒序相接,做一遍后缀数组,查询两串相应位置的LCP就是以该点为中心的回文串长度的一半分,奇偶求出所有后缀回文串,保留最长的,则补充部分为剩下的前缀的倒置。至于查询两串的LCP我们可以在height数组建立ST表查询。

 

【代码】

#include 
#include
#include
using namespace std;const int N=4000010;int n,m,Rank[N],sa[N],h[N],tmp[N],cnt[N],ans;char s[N],t[N];void suffixarray(int n,int m){ int i,j,k;n++; for(i=0;i<2*n+5;i++)Rank[i]=sa[i]=h[i]=tmp[i]=0; for(i=0;i
=n-1)break; }for(j=Rank[h[i=k=0]=0];i
r)swap(l,r);l++; int k=lg2[r-l+1]; return min(f[l][k],f[r-(1<
=0;i++,j--)s[i]=t[j]; s[m=i]=0;}int main(){ while(~scanf("%s",t)){ init(); suffixarray(m,128); rmq_init(m); int ans=0,pos=m+1; for(int i=0;i
ans&&i+k==n)ans=2*k-1,pos=i-k+1; k=rmq_min(Rank[i],Rank[m-i]); if(2*k>ans&&i+k==n)ans=2*k,pos=i-k; }for(int i=0;i
=0;i--)printf("%c",s[i]); puts(""); }return 0;}

 

  

 

转载于:https://www.cnblogs.com/forever97/p/uva11475.html

你可能感兴趣的文章
CentOS的IP配置专题
查看>>
基于WCF大型分布式系统的架构设计
查看>>
Bat文件注册组件
查看>>
Autoit 3 常用的语句
查看>>
PAT L2-016 愿天下有情人都是失散多年的兄妹
查看>>
抛弃IIS,利用FastCGI让Asp.net与Nginx在一起
查看>>
C. Tanya and Toys_模拟
查看>>
jQuery基础——事件
查看>>
Java对象和引用
查看>>
ensp 启动路由器 43 错误解决方法
查看>>
Tail-chaining(末尾连锁)中断说明
查看>>
ASP.NET 推荐书籍
查看>>
mysql安装
查看>>
20172319 《程序设计与数据结构》 第二周学习总结
查看>>
02-Python基础之列表
查看>>
08-Python基础之迭代器与生成器
查看>>
POJ P3254 Corn fields 【状压dp】
查看>>
BZOJ3542 DZY Loves March 【map + 线段树】
查看>>
.net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化...
查看>>
ViewPager的使用方法和实现过程
查看>>