ural1297 求最长回文子串 | 后缀数组
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 20005
using namespace std;
int buf1[N],buf2[N],sa[N],rnk[N],buc[N],n,height[N],ans,Log[N],pos,Min[N][];
char s[N];
void suffix_sort()
{
int *x=buf1,*y=buf2,m=;
for (int i=;i<m;i++) buc[i]=;
for (int i=;i<=n;i++) buc[x[i]=s[i]]++;
for (int i=;i<=m;i++) buc[i]+=buc[i-];
for (int i=n;i;i--) sa[buc[x[i]]--]=i;
for (int k=;k<=n;k<<=)
{
int p=;
for (int i=n-k+;i<=n;i++)
y[++p]=i;
for (int i=;i<=n;i++)
if (sa[i]>k) y[++p]=sa[i]-k;
for (int i=;i<=m;i++) buc[i]=;
for (int i=;i<=n;i++) buc[x[y[i]]]++;
for (int i=;i<=m;i++) buc[i]+=buc[i-];
for (int i=n;i;i--) sa[buc[x[y[i]]]--]=y[i];
swap(x,y),x[sa[]]=p=;
for (int i=;i<=n;i++)
if (y[sa[i-]]==y[sa[i]] && y[sa[i-]+k]== y[sa[i]+k])
x[sa[i]]=p;
else x[sa[i]]=++p;
if ((m=p)>=n) break;
}
for (int i=;i<=n;i++)
rnk[sa[i]]=i;
for (int i=,j,k=;i<=n;i++)
{
if (rnk[i]==) continue;
if (k) k--;
j=sa[rnk[i]-];
while (s[i+k]==s[j+k] && i+k<=n && j+k<=n) k++;
height[rnk[i]]=k;
}
}
void InitRmq()
{
for (int i=;i<=n;i++) Min[i][]=height[i];
for (int j=;j<=;j++)
for (int i=;i+(<<j)-<=n;i++)
Min[i][j]=min(Min[i][j-],Min[i+(<<j-)][j-]);
}
int Query(int x,int y)
{
int i=rnk[x],j=rnk[y];
if (i>j) swap(i,j);
int len=Log[j-i];
return min(Min[i+][len],Min[j-(<<len)+][len]);
}
int main()
{
scanf("%s",s+);
n=strlen(s+);
if (n==)
{
puts(s+);
return ;
}
s[n+]='#';
for (int i=;i<=n;i++)
s[*n+-i]=s[i];
n=n*+;
suffix_sort();
for (int i=;i<=n;i++)
Log[i]=Log[i>>]+;
InitRmq();
for (int i=;i<=(n-)/;i++)
{
int tmp=Query(i,n-i+);
if (tmp*>ans) ans=tmp*,pos=i-tmp;
tmp=Query(i,n-i+);
if (tmp*->ans) ans=tmp*-,pos=i-tmp+;
}
for (int i=;i<=ans;i++)
putchar(s[i+pos-]);
return ;
}
ural1297 求最长回文子串 | 后缀数组的更多相关文章
- URAL 1297 最长回文子串(后缀数组)
1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...
- Ural1297 最长回文子串(后缀数组+RMQ)
/* 源程序丢失QWQ. 就不粘代码了. 大体做法是把串反转然后连接. 做一遍后缀数组. 对height做一遍rmq. 然后对于每个位置的奇偶分别判断, 记下pos. 注意求的是[l+1,r]的hei ...
- hdu 3068 最长回文(manachar求最长回文子串)
题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <strin ...
- PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789177.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- Manacher模板( 线性求最长回文子串 )
模板 #include<stdio.h> #include<string.h> #include<algorithm> #include<map> us ...
- 后缀数组 - 求最长回文子串 + 模板题 --- ural 1297
1297. Palindrome Time Limit: 1.0 secondMemory Limit: 16 MB The “U.S. Robots” HQ has just received a ...
- 求最长回文子串 - leetcode 5. Longest Palindromic Substring
写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...
- Manacher算法 O(n) 求最长回文子串
转自:http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474 其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧. ...
- Manacher算法——求最长回文子串
首先,得先了解什么是回文串.回文串就是正反读起来就是一样的,如“abcdcba”.我们要是直接采用暴力方法来查找最长回文子串,时间复杂度为O(n^3),好一点的方法是枚举每一个字符,比较较它左右距离相 ...
随机推荐
- hdu5305 Friends(dfs,多校题)
Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- Windows运行机理——窗口和句柄
Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 1. 窗口 窗口是Windows应用程序中一个非常重要的元素,一个Wi ...
- OpenMPI源码剖析4:rte.h 头文件的说明信息
上一篇文章中说道,我们在 rte.h 中发现了有价值的说明: 我们一块一块来分析,首先看到第一块,关于 Process name Object: * (a) Process name objects ...
- LeeCode第一次刷题(两数相加)
题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组 ...
- PHP正则相关
描述字符串排列模式的一种自定义语法规则 如果可以使用字符串函数处理的任务 就不要使用正则 正则表达式 就是通过构建具有特定规则的模式,与输入的字符信息比较 在进行 分割 匹配 查找 替换 等工作 ...
- day-15 用opencv怎么扫描图像,利用查找表和计时
一.本节知识预览 1. 怎样遍历图像的每一个像素点? 2. opencv图像矩阵怎么被存储的? 3. 怎样衡量我们算法的性能? 4. 什么是查表,为什么要使用它们? 二.什么是查表,为什么要使 ...
- 又见CLOSE_WAIT
原文: http://mp.weixin.qq.com/s?__biz=MzI4MjA4ODU0Ng==&mid=402163560&idx=1&sn=5269044286ce ...
- coding.net 版本控制
这是版本测试的所有内容,其中用到了 git 和coding的远程连接. 代码及版本控制 git地址:https://git.coding.net/tianjiping/11111.git
- 2019寒假训练营第三次作业part2 - 实验题
热身题 服务器正在运转着,也不知道这个技术可不可用,万一服务器被弄崩了,那损失可不小. 所以, 决定在虚拟机上试验一下,不小心弄坏了也没关系.需要在的电脑上装上虚拟机和linux系统 安装虚拟机(可参 ...
- python学习笔记02:运行python程序
1.启动cmd命令行,输入python后回车,运行python解释器: 输入python代码后回车: print('Hello World')