ural 1297. Palindrome
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1297
求最长回文子串
典型的后缀数组的入门题目,但是可以用更简单的方法解决,毕竟数据量比较小啊
转载:
题目大意:给出一个字符串,求它的连续最长回文子串。
分析:这题数据规模不大(n<=1000),所以直接暴力可以解决。不过如果数据规模大了,暴力就不行了。这里介绍后缀数组的做法。
首先,枚举回文子串的中心所在位置。这里要分回文串长度为奇数和偶数两种情况考虑。这两个问题均可以转化为求一个后缀和一个倒着写的后缀的最长公共前缀。
具体地,将原串与反着写之后的原串相连,中间以一个特殊字符隔开。这个特殊字符只要不是0号,不影响后缀的排序,就没有问题。(不能是0是因为我的倍增算法要求除了字符串的最后一位以外,其它位不能为0,否则会出错)然后算出height数组。两个后缀的最长公共前缀为两个后缀排序之后,它们之间的串的height值的最小值。这个可以自己举个具体例子好好体会。用st算法求解rmq问题即可。
********************************************************************************************************************************************************************************************************************
代码如下:
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=;
int n,w[maxn],wa[maxn],wb[maxn],wv[maxn];
int a[maxn],sa[maxn],rank[maxn],height[maxn],f[maxn][];
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 i,j,p,*x=wa,*y=wb,*t;
for (i=;i<m;i++) w[i]=;
for (i=;i<n;i++) w[x[i]=r[i]]++;
for (i=;i<m;i++) w[i]+=w[i-];
for (i=n-;i>=;i--) sa[--w[x[i]]]=i;
for (p=,j=;p<n;m=p){
for (p=,i=n-j;i<n;i++) y[p++]=i;
for (i=;i<n;i++) if (sa[i]>=j) y[p++]=sa[i]-j;
for (i=;i<m;i++) w[i]=;
for (i=;i<n;i++) w[wv[i]=x[y[i]]]++;
for (i=;i<m;i++) w[i]+=w[i-];
for (i=n-;i>=;i--) sa[--w[wv[i]]]=y[i];
for (t=x,x=y,y=t,p=,x[sa[]]=,i=;i<n;i++)
x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
}
return;
}
void calheight(int *r,int *sa,int n){
int i,j,k=;
for (i=;i<=n;i++) rank[sa[i]]=i;
for (i=;i<n;height[rank[i++]]=k)
for (k?k--:,j=sa[rank[i]-];r[i+k]==r[j+k];k++);
return;
}
void rmq(int *rank,int n){
int i,j;
memset(f,,sizeof(f));
for (i=;i<=n;i++) f[i][]=height[i];
for (j=;j<;j++)
for (i=;i+(<<j)-<=n;i++)
f[i][j]=min(f[i][j-],f[(<<(j-))+i][j-]);
return;
}
int get_rmq(int x,int y){
int a=rank[x],b=rank[y];
if (a>b) {int t=a; a=b; b=t;}
a++;
int t=int(log(double(b-a+))/log(2.00));
return min(f[a][t],f[b-(<<t)+][t]);
}
int main(){
char s[maxn];
cin >> s;
n=strlen(s);
int i,ans=,k=;
for (i=;i<n;i++) a[i]=s[i];
a[n]=;
for (i=;i<n;i++) a[i+n+]=s[n--i];
a[*n+]=;
da(a,sa,*n+,);
calheight(a,sa,*n+);
rmq(rank,*n+);
for (i=;i<n;i++){
int t=get_rmq(i,*n-i)*-;
if (t>ans)
{
ans=t;
k=i;
}
if (i>)
{
t=get_rmq(i,*n-i+)*;
if (t>ans)
{
ans=t;
k=i;
}
}
}
if (ans%!=) for (i=k-ans/;i<=k+ans/;i++) cout<<s[i];
else for (i=k-ans/;i<k+ans/;i++) cout<<s[i];
cout<<endl;
return ;
}
ural 1297. Palindrome的更多相关文章
- URAL 1297 Palindrome 后缀数组
D - Palindrome Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- 后缀数组 POJ 3974 Palindrome && URAL 1297 Palindrome
题目链接 题意:求给定的字符串的最长回文子串 分析:做法是构造一个新的字符串是原字符串+反转后的原字符串(这样方便求两边回文的后缀的最长前缀),即newS = S + '$' + revS,枚举回文串 ...
- Manacher Ural 1297 Palindrome
1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...
- Ural 1297 Palindrome(Manacher或者后缀数组+RMQ-ST)
1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The “U.S. Robots” HQ has just received a ...
- URAL - 1297 Palindrome —— 后缀数组 最长回文子串
题目链接:https://vjudge.net/problem/URAL-1297 1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB ...
- ural 1297 Palindrome(Manacher模板题)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 求最长回文子串. http://acm.timus.ru/problem.aspx ...
- URAL 1297 Palindrome(后缀数组+ST表)
[题目链接] http://acm.timus.ru/problem.aspx?num=1297 [题目大意] 求最长回文子串,并输出这个串. [题解] 我们将原串倒置得到一个新的串,加一个拼接符将新 ...
- URAL 1297 Palindrome 最长回文子串
POJ上的,ZOJ上的OJ的最长回文子串数据量太大,用后缀数组的方法非常吃力,所以只能挑个数据量小点的试下,真要做可能还是得用manacher.贴一下代码 两个小错,一个是没弄懂string类的sub ...
- Ural 1297 Palindrome 【最长回文子串】
最长回文子串 相关资料: 1.暴力法 2.动态规划 3.中心扩展 4.Manacher法 http://blog.csdn.net/ywhorizen/article/details/6629268 ...
随机推荐
- 走入PHP-初次见面
FROM:实验楼 Linux启动WEB服务器: $ sudo service apache2 start 新建并打开test.php文件: $ sudo gvim /path/test.php PHP ...
- 一个简单用原生js实现的小游戏----FlappyBird
这是一个特别简单的用原生js实现的一个小鸟游戏,比较简单,适合新手练习 这是html结构 <!DOCTYPE html><html lang="en">&l ...
- es 6点滴记录
关于babel和webpack的使用: Babel 所做的只是帮你把'ES6 模块化语法'转化为'CommonJS 模块化语法',其中的require exports 等是 CommonJS 在具体实 ...
- 老李分享:JDK,JRE,JVM区别与联系
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...
- 转接IC整理汇总 转接芯片大全
转接口IC大全,信号转换大全EDP输出信号NCS8801 LVDS转EDP.RGB转EDP 封装QFN56 最大分辨率2560*1600用于手机.平板.转接板.液晶驱动板.广告机.可视门铃等等控制器到 ...
- 原生js实现tab切换
//通过原生js实现table切换<html><head><meta http-equiv="Content-Type" content=" ...
- R语言生成随机数
1.概述 作为一种语言进行统计分析,R有一个随机数生成各种统计分布功能的综合性图书馆.R语言可以针对不同的分布,生成该分布下的随机数.其中,有许多常用的个分布可以直接调用.本文简单介绍生成常用分布随机 ...
- ios app网址说明
URLforBrowser = 'https://itunes.apple.com/cn/app/wan-huo-shi-shang-zhu-li-ren/id1077705***'; URLfori ...
- Mac下安装BeautifulSoup
1.输入命令su,输入root密码,进入root用户 2.执行命令安装pip: sudo easy_install pip 详细pip介绍:http://blog.csdn.net/olanlanxi ...
- 一道CVTE前端二面笔试题
题目:给你一个数组,输出数组中出现次数第n多的数字; 比如:[1,1,1,2,2,2,3,3,4,4,5,5,6,6,7]; 1---3次 2---3次 3---2次 4---2次 5---2次 6- ...