博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【后缀数组】【线段树】poj3974 Palindrome
阅读量:6372 次
发布时间:2019-06-23

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

考虑奇数长度的回文,对于字符串上的每个位置i,如果知道从i开始的后缀和到i为止的前缀反转后的字符串的lcp长度的话,也就知道了以第i个字符为对称中心的最长回文的长度了。因此,我们用在S中不会出现的字符将S和S反转后的字符串拼接起来,得到字符串S',计算S'的sa。于是,从i开始的后缀和到i为止的前缀反转后的字符串就都是S'中的后缀了,利用高度数组,可以轻易地求得它们最长公共前缀的长度。

对于长度为偶数的回文的处理也基本相同。

哈哈哈,MLE+TLE不可避。

#include
#include
#include
using namespace std;#define N 2000001#define INF 2147483647char s[N];int tong['z'+1],t[N],n,t2[N],sa[N],lcp[N],rank[N];bool cmp(int *y,int i,int k){ return ((y[sa[i-1]]==y[sa[i]])&&((sa[i-1]+k>=n?-1:y[sa[i-1]+k])==(sa[i]+k>=n?-1:y[sa[i]+k])));}void build_sa(int range){ int *x=t,*y=t2; memset(tong,0,sizeof(int)*range); for(int i=0;i
=0;--i) sa[--tong[x[i]]]=i; for(int k=1;k<=n;k<<=1) { int p=0; for(int i=n-k;i
=k) y[p++]=sa[i]-k; memset(tong,0,sizeof(int)*range); for(int i=0;i
=0;--i) sa[--tong[x[y[i]]]]=y[i]; swap(x,y); p=1; x[sa[0]]=0; for(int i=1;i
=n) break; range=p; }}void get_lcp(){ int k=0; for(int i=0;i
>1); buildtree(rt<<1,l,m); buildtree(rt<<1|1,m+1,r); minv[rt]=min(minv[rt<<1],minv[rt<<1|1]);}int query(int ql,int qr,int rt,int l,int r){ if(ql<=l&&r<=qr) return minv[rt]; int m=(l+r>>1),res=INF; if(ql<=m) res=min(res,query(ql,qr,rt<<1,l,m)); if(m

转载于:https://www.cnblogs.com/autsky-jadek/p/4460650.html

你可能感兴趣的文章
环球花木网的目标就是致力于打造成为“园林相关行业的专业性门户网站
查看>>
《编写高质量代码:改善c程序代码的125个建议》—— 建议14-1:尽量避免对未知的有符号数执行位操作...
查看>>
《C语言编程魔法书:基于C11标准》——2.2 整数在计算机中的表示
查看>>
全球程序员编程水平排行榜TOP50,中国排名第一
查看>>
HDFS 进化,Hadoop 即将拥抱对象存储?
查看>>
Edge 浏览器奇葩 bug:“123456”打印成“114447”
查看>>
Sirius —— 开源版的 Siri ,由 Google 支持
查看>>
《OpenGL ES应用开发实践指南:Android卷》—— 2.7 小结
查看>>
《Windows Server 2012活动目录管理实践》——第 2 章 部署第一台域控制器2.1 案例任务...
查看>>
Java Date Time 教程-时间测量
查看>>
Selector.wakeup实现注记
查看>>
《Java EE 7精粹》—— 第1章 Java EE 1.1 简介
查看>>
《Exchange Server 2013 SP1管理实践》——导读
查看>>
syslog:类Unix系统常用的log服务
查看>>
使用Annotation设计持久层
查看>>
深入实践Spring Boot2.4.1 Neo4j依赖配置
查看>>
Zen Cart 如何添加地址栏上的小图标
查看>>
SecureCrt 连接Redhat linux
查看>>
[NHibernate]持久化类(Persistent Classes)
查看>>
如何在Hive中使用Json格式数据
查看>>