hdu 3068 最长回文子串 TLE
后缀数组+RMQ是O(nlogn)的,会TLE.....
标准解法好像是马拉车,O(n)....
#include "algorithm"
#include "cstdio"
#include "cstring"
using namespace std;
#define maxn 220020 int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
int rank[maxn],height[maxn];
int r[maxn],sa[maxn],RMQ[maxn][];
char s[];
int 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 i,j,p,*x=wa,*y=wb,*t;
for(i=; i<m; i++) ws[i]=; //注意此处有个小问题:ws和iostream里面某地重名了..
for(i=; i<n; i++) ws[x[i]=r[i]]++;
for(i=; i<m; i++) ws[i]+=ws[i-];
for(i=n-; i>=; i--) sa[--ws[x[i]]]=i;
for(j=,p=; p<n; j*=,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<n; i++) wv[i]=x[y[i]];
for(i=; i<m; i++) ws[i]=;
for(i=; i<n; i++) ws[wv[i]]++;
for(i=; i<m; i++) ws[i]+=ws[i-];
for(i=n-; i>=; i--) sa[--ws[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;
} bool _same(int lx,int ly,int l1,int l2)
{
return (((lx<=l1-) && (ly>=l1+))||((ly<=l1-) && (lx>=l1+)));
} void ST() //初始化
{
memset(RMQ,,sizeof(RMQ));
for(int i=;i<=n;i++)
RMQ[i][]=height[i];
for(int j=;(<<j)<=n;j++)
for(int i=;i+(<<j)-<=n;i++)
RMQ[i][j]=min(RMQ[i][j-],RMQ[i+(<<(j-))][j-]);
} int Query(int L,int R) //求a[L..R]区间的最值
{
int k=;
while((<<(k+))<=R-L+) k++;
int tb=min(RMQ[L][k],RMQ[R-(<<k)+][k]);
return tb;
} int calc(int l,int r) //求l开始后缀和r开始后缀的最长公共前缀
{
int tl=rank[l],tr=rank[r];
if (tl>tr) swap(tl,tr);
tl++;
int ans=Query(tl,tr); //相当于RMQ问题
// printf("calc: %d %d -- %d %d == %d\n",l,r,tl,tr,ans);
return ans;
} int _max(int a,int b,int c,int d)
{
int mx=a;
if (b>mx) mx=b;
if (c>mx) mx=c;
if (d>mx) mx=d;
return mx;
} //da(r,sa,n+1,128);
//calheight(r,sa,n);
int main()
{
while(~scanf("%s",s))
{
n=strlen(s); for (int i=; i<n; i++)
r[i]=int(s[i])-int('a')+; r[n]=;
for (int i=n-; i>=; i--)
r[*n-i]=int(s[i])-int('a')+;
r[*n+]=;
int n2=n; n=*n+; // for (int i=0; i<=n; i++) printf("%d ",r[i]);
// printf("\n %d %d\n",n,n2); da(r,sa,n+,);
calheight(r,sa,n); // for (int i=0; i<=n; i++)
// printf("%d %d %d\n",sa[i],height[i],rank[i]);
// printf("\n"); ST();
int ans=;
for (int i=; i<=n2-; i++)
{
int t1=calc(i,n-i)*;
int t2=calc(i+,n-i)*+;
int t3=calc(i+,n-i-)*;
// printf("%d %d %d\n",t1,t2,t3);
ans=_max(ans,t1,t2,t3);
}
printf("%d\n",ans);
}
return ;
}
最近两天有点不在状态....先滚去整理模板吧
hdu 3068 最长回文子串 TLE的更多相关文章
- hdu 3068 最长回文子串 马拉车模板
前几天用后缀数组写过一次这题,毫无疑问很感人的TLE了-_-|| 今天偶然发现了马拉车模板,O(N)时间就搞定 reference:http://acm.uestc.edu.cn/bbs/read.p ...
- HDU 3068 [最长回文子串]
#include<iostream> #include<string> #include<string.h> #include<algorithm> # ...
- hdu 3068 最长回文(manachar求最长回文子串)
题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <strin ...
- HDU - 3068 最长回文(manacher)
HDU - 3068 最长回文 Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Subm ...
- hdu 3068 最长回文 manacher算法(视频)
感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...
- HDU 3068 最长回文 【最长回文子串】
和上一题一样,不过这题只是要求最长回文子串的长度 在此采用了非常好用的Manacher算法 据说还是O(n) 的效率QAQ 详细用法参考了上篇博客的参考资料,这两天有空学习一下~ Source cod ...
- HDU 3068 最长回文 (Manacher最长回文串)
Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输 ...
- HDU 3068 最长回文(manachar算法)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 3068 最长回文( Manacher模板题 )
链接:传送门 思路:Manacher模板题,寻找串中的最长回文子串 /***************************************************************** ...
随机推荐
- 定制你的Unity编辑器
Unity的编辑器可以通过写脚本进行界面定制,包括添加功能菜单,今天写游戏Demo用到了记录一下. 为Unity添加子菜单 示例程序 [AddComponentMenu("Defend Ho ...
- DataGridView 行、列的隐藏和删除
) 行.列的隐藏 [VB.NET] ' DataGridView1的第一列隐藏 DataGridView1.Columns(0).Visible = False ' DataGridView1的第一行 ...
- [知乎] 刚开始学习 iOS 开发有什么书推荐呢?
http://www.zhihu.com/question/19649679 我来说说我学习的过程:(无耻的使用一个回答 回答了很多问题.^^) 第一步,精读 Stephen G. Kochan 的& ...
- Android Studio下载与安装
Android Studio下载与安装 1 2 3 4 5 分步阅读 百度经验:jingyan.baidu.com 自从Google宣布Android Studio将取代Eclipse,正式成为官方集 ...
- awk 和 sed 使用案例
1.模仿wc的行为,统计一个文本文件的文件的字符数.行数.单词数. awk '{numOfChar+=length($0);numOfWord+=NF}END{print numOfChar" ...
- 【转】【C#】C#性能优化总结
1. C#语言方面 1.1 垃圾回收 垃圾回收解放了手工管理对象的工作,提高了程序的健壮性,但副作用就是程序代码可能对于对象创建变得随意. 1.1.1 避免不必要的对象创 ...
- 使用dynamic获取类型可变的json对象
标题可能有点含糊不清 我这个例子的来源是,对方会返回给我json,不过成功的json与失败的json是不同的对象 我想用一个方法获取到这个对象的所有属性并打印到log中 因为是动态变化的,所以第一个想 ...
- 未能进入中断模式,原因如下:源文件“XXXXXX”不属于正在调试的项目。
这个问题是由于项目文件位置变动导致的.提示框已经说的比较清楚了. 首先可以尝试[重新生成] ,一般可以解决这个问题了. 我遇到的情况是,设置配置时,不小心取消了生成选择. 所以打开配置管理器,把相关的 ...
- Qt——正则表达式
在项目中经常会遇到对字符串进行操作的情况,我们可以直接使用QString的一些函数,但QT提供了一个更加强大的类——QRegExp,使用正则表达式来操作字符串. 先说说我最近遇到的几个问题: 1.对输 ...
- dxut.h(29): fatal error C1083: Cannot open include file: 'dxsdkver.h': No such file or directory
从网上download一个三维演示模型的软件编译发现报找不到dxsdkver.h文件,网上查阅这是MS的DirectX sdk中的库文件,于是先download DirectX SDK 安装之后,配置 ...