博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
URAL 1297 求最长回文字符串
阅读量:4574 次
发布时间:2019-06-08

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

有种简单的方法,数组从左到右扫一遍,每次以当前的点为中心,只要左右相等就往左右走,这算出来的回文字符串是奇数长度的

还有偶数长度的回文字符串就是以当前扫到的点和它左边的点作为中心,然后往左右扫

这是O(n^2)的复杂度,这道题过还是没有问题的

 

这里我主要练习的是另外的利用后缀数组加RMQ算法来解决这个问题

大致思想跟上面一致

首先将字符串反转贴在原字符串末尾,将字符通过ASCII码转化为字符,之间用一个1分开,最后贴一个0

然后得到它的后缀数组以及height[]数组

那么找回文字符也是扫一遍,每次以当前点作为偶数情况和奇数情况的中心

然后找到后来倒置的字符串对应字符的位置,这样二者的前缀一个是往前走的,一个是往后走的,正好贴一块就是回文的

但是这个查询为加快速度,就要用RMQ算法,求得区间内height数组的最小值

 

1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 #define MAXN 2010 7 int sa[MAXN] , height[MAXN] , _rank[MAXN]; 8 int wa[MAXN] , wb[MAXN] , wsf[MAXN] , wv[MAXN] , r[MAXN]; 9 int dp[MAXN][15]; 10 char str[MAXN]; 11 12 int cmp(int *r , int a , int b , int l) 13 { 14 return r[a]==r[b] && r[a+l]==r[b+l]; 15 } 16 17 void getSa(int *r , int *sa , int n , int m) 18 { 19 int i,j,p; 20 int *x=wa , *y=wb , *t; 21 22 for(i=0 ; i
=0 ; i--) sa[--wsf[x[i]]]=i; 26 27 p=1; 28 for(j=1 ; p
=j) y[p++]=sa[i]-j; 32 33 for(i=0 ; i
=0 ; i--)sa[--wsf[wv[i]]]=y[i]; 38 39 t=x , x=y , y=t; 40 x[sa[0]]=0; 41 for(i=1,p=1;i

 

转载于:https://www.cnblogs.com/CSU3901130321/p/4391291.html

你可能感兴趣的文章
函数PARSENAME使用和截取字符串
查看>>
关乎性能的判断,请作出果断选择
查看>>
判断是否包含指定的字符
查看>>
[Html5] HTML5 开发手机应用
查看>>
[工具] 各种主流 SQLServer 迁移到 MySQL 工具对比
查看>>
(二)Maven 基本概念——依赖、生命周期、仓库管理、聚合&继承
查看>>
py4CV例子3Mnist识别和ANN
查看>>
【4Opencv】如何识别出轮廓准确的长和宽
查看>>
现货黄金交易计划摸索
查看>>
Django中国|Django中文社区——python、django爱好者交流社区
查看>>
java中的toArray()
查看>>
java数据库之JDBC
查看>>
C语言 strcpy,memcpy,memmove,memccpy函数
查看>>
SqlSession 内部运行
查看>>
C语言一个小程序的bug疑问 数组相关[已解决]
查看>>
空指针与野指针的区别
查看>>
Ubuntu的root用户问题
查看>>
Linux启动新进程的几种方法及比较[转]
查看>>
使用Python定义类及创建对象
查看>>
[SoapUI] 比较两个不同环境下的XML Response, 从外部文件读取允许的偏差值,输出结果到文本文件...
查看>>