#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 求最长回文子串 | 后缀数组的更多相关文章

  1. URAL 1297 最长回文子串(后缀数组)

    1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...

  2. Ural1297 最长回文子串(后缀数组+RMQ)

    /* 源程序丢失QWQ. 就不粘代码了. 大体做法是把串反转然后连接. 做一遍后缀数组. 对height做一遍rmq. 然后对于每个位置的奇偶分别判断, 记下pos. 注意求的是[l+1,r]的hei ...

  3. hdu 3068 最长回文(manachar求最长回文子串)

    题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <strin ...

  4. PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789177.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  5. Manacher模板( 线性求最长回文子串 )

    模板 #include<stdio.h> #include<string.h> #include<algorithm> #include<map> us ...

  6. 后缀数组 - 求最长回文子串 + 模板题 --- ural 1297

    1297. Palindrome Time Limit: 1.0 secondMemory Limit: 16 MB The “U.S. Robots” HQ has just received a ...

  7. 求最长回文子串 - leetcode 5. Longest Palindromic Substring

    写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...

  8. Manacher算法 O(n) 求最长回文子串

    转自:http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474 其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧. ...

  9. Manacher算法——求最长回文子串

    首先,得先了解什么是回文串.回文串就是正反读起来就是一样的,如“abcdcba”.我们要是直接采用暴力方法来查找最长回文子串,时间复杂度为O(n^3),好一点的方法是枚举每一个字符,比较较它左右距离相 ...

随机推荐

  1. leetcode--笔记8 Fizz Buzz

    题目要求: Write a program that outputs the string representation of numbers from 1 to n. But for multipl ...

  2. Unity AssetBundle工作流

    一.创建AssetBundle 1.在资源的Inspector视图下有一个AssetBundle的UI,第一个选项表示AssetBundle名称,第二个用于设置AssetBundle Variant, ...

  3. WPF Issues

    Grid row height is star, but the height setting does not work in a prism:region Problem: My original ...

  4. Qt-第一个QML程序-4-自定义按钮类,动画,状态

    上篇中,我们写到了自己定义了一个按钮,但是呢,按照这样的写法,要写一个程序出来,那要累死了,所以,qml给我的感觉就是各种随便调用,所以了,可以自己写一个自己Button的qml,这样在以后用到了,就 ...

  5. Java开发工程师(Web方向) - 04.Spring框架 - 第2章.IoC容器

    第2章.IoC容器 IoC容器概述 abstract: 介绍IoC和bean的用处和使用 IoC容器处于整个Spring框架中比较核心的位置:Core Container: Beans, Core, ...

  6. 逆波兰表达式[栈 C 语言 实现]

    逆波兰表达式 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示 ...

  7. C++复合类型(结构,共用体,枚举)

    •结构是用户定义的类型,而结构的声明定义了这种类型的数据属性. 一.关键字struct声明:   定义了一种新类型 struct inflatable{ char name[20];//结构成员 fl ...

  8. vim—自动缩进(编写Python脚本)

    大神推荐使用vim编写Python脚本,学而时积之,不亦乐乎! 使用vim编写Python脚本的时候不能正常缩进,需要修改vimrc文件 Ubuntu系统下vimrc文件的位置: $ cd /etc/ ...

  9. tensorflow学习笔记(4)-学习率

    tensorflow学习笔记(4)-学习率 首先学习率如下图 所以在实际运用中我们会使用指数衰减的学习率 在tf中有这样一个函数 tf.train.exponential_decay(learning ...

  10. Linux内核设计笔记10——内核同步

    Linux内核同步笔记 几个基本概念 - 临界区(critical region):访问和操作共享数据的代码段: - 原子操作:操作在执行中不被打断,要么不执行,要么执行完: - 竞争条件: 两个线程 ...