感觉最近好混乱......各种OJ都刷一点,感觉不太好......尤其是这种英文题

  这道题一开始还没有看懂。听了ljh大犇的解释后终于明白了。下面我为英语和我一样的人翻译一下题面:

  输入n个数。求最长的两端不交叉的序列,使它们的变化量相同,即相邻两位的差相同。当这个长度小于5时输出0。

  好了,这道题是不是和最长不重叠子串有点像?把原数组差分后,简直一模一样。我们先构出原数组的后缀数组,然后二分一个答案(答案显然具有单调性是吧?),扫一遍height数组看一看是否存在后缀i,j,使得lcp(i,j)>=x && abs(len(j)-len(i))>x 。找到了当前答案(x)就是可行的。一路判断下去就可以辣!不过这道题要注意:原数组差分之后只有n-1个!

  下面贴代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout);
#define maxn 200010 using namespace std;
typedef long long llg; int n,ht[maxn],rk[maxn],sa[maxn],c[maxn],a[maxn]; int getint(){
int w=;bool q=;
char c=getchar();
while((c>''||c<'')&&c!='-') c=getchar();
if(c=='-') q=,c=getchar();
while(c>=''&&c<='') w=w*+c-'',c=getchar();
return q?-w:w;
} void build_sa(int m){
int i,*x=rk,*y=ht;
for(i=;i<=m;i++) c[i]=;
for(i=;i<=n;i++) c[x[i]=a[i]]++;
for(i=;i<=m;i++) c[i]+=c[i-];
for(i=n;i;i--) sa[c[x[i]]--]=i;
for(int k=,p;k<=n;k<<=){
p=;
for(i=n-k+;i<=n;i++) y[++p]=i;
for(i=;i<=n;i++) if(sa[i]>k) y[++p]=sa[i]-k;
for(i=;i<=m;i++) c[i]=;
for(i=;i<=n;i++) c[x[y[i]]]++;
for(i=;i<=m;i++) c[i]+=c[i-];
for(i=n;i;i--) sa[c[x[y[i]]]--]=y[i];
swap(x,y); x[sa[]]=; p=;
for(i=;i<=n;i++)
x[sa[i]]=(y[sa[i-]]==y[sa[i]] && y[sa[i-]+k]==y[sa[i]+k])?p:++p;
if(p==n) break; m=p;
}
for(i=;i<=n;i++) rk[sa[i]]=i;
for(int i=,j,k=;i<=n;i++){
if(k) k--;
j=sa[rk[i]-];
while(a[i+k]==a[j+k]) k++;
ht[rk[i]]=k;
}
} bool pd(int x){
for(int i=,ma,mi;i<=n;){
while(ht[i]<x && i<=n) i++;
ma=mi=sa[i-];
while(ht[i]>=x && i<=n){
ma=max(ma,sa[i]);
mi=min(mi,sa[i]);
i++;
}
if(ma-mi>x) return ;
}
return ;
} int main(){
File("a");
n=getint();
while(n){
for(int i=;i<n;i++) a[i]=getint();
for(int i=n-;i;i--) a[i]=a[i]-a[i-]+;
build_sa();
int l=,r=n+,mid;
while(l!=r){
mid=l+r>>;
if(pd(mid)) l=mid+;
else r=mid;
}
if(l<=) printf("0\n");
else printf("%d\n",l);
n=getint();
}
return ;
}

  

POJ 1743 Musical Theme的更多相关文章

  1. POJ 1743 Musical Theme (后缀数组,求最长不重叠重复子串)(转)

    永恒的大牛,kuangbin,膜拜一下,Orz 链接:http://www.cnblogs.com/kuangbin/archive/2013/04/23/3039313.html Musical T ...

  2. poj 1743 Musical Theme(最长重复子串 后缀数组)

    poj 1743 Musical Theme(最长重复子串 后缀数组) 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复 ...

  3. Poj 1743 Musical Theme (后缀数组+二分)

    题目链接: Poj  1743 Musical Theme 题目描述: 给出一串数字(数字区间在[1,88]),要在这串数字中找出一个主题,满足: 1:主题长度大于等于5. 2:主题在文本串中重复出现 ...

  4. POJ 1743 Musical Theme 【后缀数组 最长不重叠子串】

    题目冲鸭:http://poj.org/problem?id=1743 Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Su ...

  5. POJ 1743 Musical Theme 后缀数组 最长重复不相交子串

    Musical ThemeTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=1743 Description ...

  6. POJ 1743 Musical Theme (字符串HASH+二分)

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15900   Accepted: 5494 De ...

  7. poj 1743 Musical Theme (后缀数组+二分法)

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16162   Accepted: 5577 De ...

  8. Poj 1743——Musical Theme——————【后缀数组,求最长不重叠重复子串长度】

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 22499   Accepted: 7679 De ...

  9. Poj 1743 Musical Theme(后缀数组+二分答案)

    Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 28435 Accepted: 9604 Descri ...

  10. POJ 1743 Musical Theme 二分+后缀数组

    Musical Theme   Description A musical melody is represented as a sequence of N (1<=N<=20000)no ...

随机推荐

  1. 【读书笔记】iOS网络-使用推送通知

    一,本地通知 本地通知有64位的最大限制.虽然,你依然可以调度通知,不过到到达的通知数被限定为接近64个,并且按照fireDate的顺序排序,系统会忽略掉其余的通知.这意味着如果现在有64个调用的本地 ...

  2. iOS-UITableView的优化(纯手打原创)

    TableView的优化 一:什么是TableView的优化以及为什么要优化 1)CPU(中央处理器)和GPU(图形处理器)   CPU主要从事逻辑计算的一些工作 GPU主要从事图形处理方面的工作 2 ...

  3. jQuery Grid With ASP.Net MVC

    jQuery Grid 能够在 ASP.NET MVC 中轻松地实现分页. 排序. 筛选以及 jQuery 插件网格中的 CRUD 操作. 具有以下特征: 时尚的表格数据呈现控件. JavaScrip ...

  4. Harrypotter

    #include<iostream> using namespace std; int main() { ]={}; int a,b,c,d; cout<<"请输入总 ...

  5. 每日Scrum(3)

    冲刺第三天,团队重心还是在于把软件变得更加的高大上加上狂拽炫酷...内部功能呈现的多元化和吸引力是我们追求的目标: 问题出现的毫无疑问是创意,借鉴其他的类似软件和好的创意是最近的工作重心.

  6. Vmware快速安装linux虚拟机(SUSE)

    安装环境:Vmware 11.SUSE11 64位 vmware快速安装linux虚拟机的过程还是比较简单的,步骤如下: 1.点击文件,新建虚拟机. 2.选择典型安装. 3.在红框中选择想要安装的虚拟 ...

  7. (ios)MPMoviePlayerController首次播放视频的时候,没有控制条

    问题: 在视频播放时,现在控制条采用磨砂的效果,会遮罩部分视频 解决思路 1 播放器直接设置不带控制条,在app在 Foreground状态,默认播放器暂停,这样需要在获得Foreground事件,进 ...

  8. SSRS 的简单使用(一)

    简介 SQL Server Reporting Services(SSRS),微软企业级报表平台,和SQL Server Integration Service以及SQL Server Analysi ...

  9. java.lang.OutOfMemoryError处理错误

    内存详解 原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多 ...

  10. Java并发之Condition 并发同步控制

    package com.thread.test.thread; import java.util.PriorityQueue; import java.util.concurrent.locks.Co ...