题解:

后缀数组

st表处理加速lcp

把串后面加一个不可能出现的字符

然后再把串倒过来放在后面

暴力枚举中心

判断lcp

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=;
int ws1[N],wv[N],wa[N],wb[N],rank1[N],height[N],sa[N],a[N],n,dp[N][];
char str[N];
int cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}
void da(int *r,int *sa,int n,int m)
{
int *x=wa,*y=wb;
for (int i=;i<m;i++)ws1[i]=;
for (int i=;i<n;i++)ws1[x[i]=r[i]]++;
for (int i=;i<m;i++)ws1[i]+=ws1[i-];
for (int i=n-;i>=;i--)sa[--ws1[x[i]]]=i;
for (int j=,p=;p<n;j*=,m=p)
{
p=;
for (int i=n-j;i<n;i++)y[p++]=i;
for (int i=;i<n;i++)
if (sa[i]>=j)y[p++]=sa[i]-j;
for (int i=;i<n;i++)wv[i]=x[y[i]];
for (int i=;i<m;i++)ws1[i]=;
for (int i=;i<n;i++)ws1[wv[i]]++;
for (int i=;i<m;i++)ws1[i]+=ws1[i-];
for (int i=n-;i>=;i--)sa[--ws1[wv[i]]]=y[i];
p=;swap(x,y);x[sa[]]=;
for (int i=;i<n;i++)x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
}
}
void calheight(int *r,int *sa,int n)
{
int j,k=;
for (int i=;i<=n;i++)rank1[sa[i]]=i;
for (int i=;i<n;height[rank1[i++]]=k)
for (k?k--:,j=sa[rank1[i]-];r[i+k]==r[j+k];k++);
}
void RMQ()
{
memset(dp,,sizeof(dp));
for (int i=;i<=n*+;i++)dp[i][]=height[i];
for (int j=;(<<j)<=*n+;j++)
for (int i=;i+(<<j)-<=*n+;i++)
dp[i][j]=min(dp[i][j-],dp[i+(<<(j-))][j-]);
}
int lcp(int l,int r)
{
int a=rank1[l],b=rank1[r];
if (a>b)swap(a,b);
a++;
int t=(int)(log(double(b-a+))/log(2.00));
return min(dp[a][t],dp[b-(<<t)+][t]);
}
int main()
{
int res,flag,max;
while (~scanf("%s",str))
{
max=;
n=strlen(str);
for (int i=;i<n;i++)a[i]=(int)str[i];
a[n]=;
for (int i=;i<n;i++)a[i+n+]=int(str[n-i-]);
a[*n+]=;
da(a,sa,n*+,);
calheight(a,sa,*n+);
RMQ();
for (int i=;i<n;i++)
{
res=lcp(i,*n-i)*-;
if (max<res)
{
max=res;
flag=i;
}
if (i>)
{
res=lcp(i,*n-i+)*;
if (max<res)
{
max=res;
flag=i;
}
}
}
if (max%==)
for (int i=flag-max/;i<=flag+max/;i++)printf("%c",str[i]);
else
for (int i=flag-max/;i<=flag+max/-;i++)printf("%c",str[i]);
puts("");
}
return ;
}

ural1297的更多相关文章

  1. 【ural1297】 Palindrome

    http://acm.timus.ru/problem.aspx?space=1&num=1297 (题目链接) 题意 求最长回文子串 Solution 后缀数组论文题 穷举每一位,然后计算以 ...

  2. URAL1297:Palindrome——题解

    http://acm.timus.ru/problem.aspx?space=1&num=1297 https://vjudge.net/problem/URAL-1297 给定一个字符串,求 ...

  3. 【Ural1297】Palindrome(后缀数组)

    题意:求一个字符串的最长回文子串 n<=1000 思路:这是一道论文题 需要注意的细节: 1.奇偶分类 2.中间的分割符与最后的附加字母都是最小值,但两者不能相同,否则height可能会出现问题 ...

  4. 最长回文子串问题 O(n)算法 manacher URAL1297 HDU3068

    先来看一道简单的题,ural1297 给定一个1000长度的字符串,求最长回文子串. 看起来很Naive,乱搞一下,O(n^2)都可以解决. 再来看这个题 HDU3068 120个110000长度的字 ...

  5. Ural1297 Palindrome(后缀数组)

        [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=12406 [题意] 求最长回文子串. [思路] 将字符串 ...

  6. 1297. Palindrome ural1297(后缀数组)

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

  7. ural1297 求最长回文子串 | 后缀数组

    #include<cstdio> #include<algorithm> #include<cstring> #define N 20005 using names ...

  8. ural1297. Palindrome

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

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

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

随机推荐

  1. java 虹软ArcFace 2.0,java SDK使用-进行人脸检测

    虹软产品地址:http://ai.arcsoft.com.cn/product/arcface.html虹软ArcFace功能简介 人脸检测人脸跟踪人脸属性检测(性别.年龄)人脸三维角度检测人脸对比 ...

  2. linux修改网卡名为eth0

    方法1: 1.编辑网卡的配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 将里面的NAME和DEVICE项修改为eth0,ONBOOT修改为yes. ...

  3. 20165303实验一 Java开发环境的熟悉

    实验一简单的java程序编译及运行,文件夹的创建 1.添加文件夹: 命令mkdir+文件夹名称 2.编译,运行Java程序 :javac 主类名.java java 主类名 3.带包(package) ...

  4. Apache Hadoop Operations at Scale

    book: Hadoop Operations,A Guide for Developers and Administrators Apache Hadoop Operations at Scale ...

  5. Confluence 6 指派和撤销空间权限

    指派空间权限 希望添加一个新用户或者用户组到权限列表中,从希望选择的选项中查找用户组或者用户,然后选择 添加(Add).用户和用户组将会显示在列表中:选择你希望引用的权限,然后选择 保存所有(Save ...

  6. confirm提示弹出确定和取消按钮

    js----> var con = confirm('这是一个确定加取消的提示窗口') if(con==true){ document.write("点击了确定按钮") }e ...

  7. python基础之数据类型操作补充,集合及其操作,深浅拷贝

    内容概要: 数据类型操作补充 集合及其操作 深浅拷贝1.基础数据类型补充 1.1字符串的操作补充li = ["李嘉诚", "麻花藤", "黄海峰&qu ...

  8. Integer to English words leetcode java

    问题描述: Convert a non-negative integer to its english words representation. Given input is guaranteed ...

  9. 160. Intersection of Two Linked Lists(剑指Offer-两个链表的第一个公共结点)

    题目: Write a program to find the node at which the intersection of two singly linked lists begins. Fo ...

  10. Python 向列表中添加元素

    向列表中添加元素 1.append tabulation1.append('紫霞') ['大圣', '天蓬', '卷帘', '紫霞', '紫霞', '青霞'] 2.insert tabulation1 ...