#1407 : 后缀数组二·重复旋律2

Time Limit:5000ms
Case Time Limit:1000ms
Memory Limit:256MB

描述

小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律。

旋律可以表示为一段连续的数列,相似的旋律在原数列不可重叠,比如在1 2 3 2 3 2 1 中 2 3 2 出现了一次,2 3 出现了两次,小Hi想知道一段旋律中出现次数至少为两次的旋律最长是多少?

解题方法提示

输入

第一行一个整数 N。1≤N≤100000

接下来有 N 个整数,表示每个音的数字。1≤数字≤1000

输出

一行一个整数,表示答案。

Sample Input
8
1 2 3 2 3 2 3 1
Sample Output
2

分析:

和POJ1743是一样的...只不过是二分判定的时候>=和>的问题...

POJ1743

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std; const int maxn=100000+5; int n,s[maxn],gs[maxn],sa[maxn],wv[maxn],wb[maxn],ran[maxn],height[maxn]; inline bool cmp(int *x,int a,int b,int l){
return x[a]==x[b]&&x[a+l]==x[b+l];
} inline void da(int *sa,int *x,int n,int m){
int i,j,p,*y=wb;
for(i=0;i<m;i++) gs[i]=0;
for(i=0;i<n;i++) gs[x[i]]++;
for(i=1;i<m;i++) gs[i]+=gs[i-1];
for(i=n-1;~i;i--) sa[--gs[x[i]]]=i;
for(j=1,p=1;p<n;j<<=1,m=p){
for(i=n-j,p=0;i<n;i++) y[p++]=i;
for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=0;i<n;i++) wv[i]=x[y[i]];
for(i=0;i<m;i++) gs[i]=0;
for(i=0;i<n;i++) gs[wv[i]]++;
for(i=1;i<m;i++) gs[i]+=gs[i-1];
for(i=n-1;~i;i--) sa[--gs[wv[i]]]=y[i];
p=1;swap(x,y);x[sa[0]]=0;
for(i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i],sa[i-1],j)?p-1:p++;
}
} inline void calheight(int n){
int i,j,k=0;
for(i=0;i<=n;i++) ran[sa[i]]=i;
for(i=0;i<n;height[ran[i++]]=k)
for(k?k--:233,j=sa[ran[i]-1];s[i+k]==s[j+k];k++);
} inline bool check(int x){
int Min=n,Max=0;bool ans=0;
for(int i=1;i<=n;i++){
if(height[i]<x){
if(Max!=0)
if(Max-Min>=x)
ans=1;
Min=Max=sa[i];
continue;
}
Min=min(Min,sa[i]),Max=max(Max,sa[i]);
}
if(Max!=0&&Max-Min>=x)
ans=1;
return ans;
} signed main(void){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&s[i]),ran[i]=s[i];
da(sa,ran,n+1,1001);calheight(n);
int l=1,r=n>>1,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid))
ans=mid,l=mid+1;
else
r=mid-1;
}
printf("%d\n",ans);
return 0;
}//Cap ou pas cap. Pas cap.

  


By NeighThorn

最新文章

  1. 【学习笔记】Struts2之一个Action包含多个控制处理逻辑
  2. jvm--4垃圾收集
  3. 74.Android之四种启动模式
  4. [HDOJ5935]Car(精度,数学)
  5. SQL疑难杂症【3】链接服务器提示&quot;无法启动分布式事物&quot;
  6. JavaWeb学习记录(十九)——jstl自定义标签之简单标签
  7. datagrid指定行合并导出
  8. Chapter06-Phylogenetic Trees Inherited(POJ 2414)(减少国家DP)
  9. &lt;hdu - 1272&gt; 小希的迷宫 并查集问题 (注意特殊情况)
  10. js 从一个函数中传递值到另一个函数
  11. 基于WAMP的Crossbario 安装入门
  12. 手持式停车收费管理系统全套案例,支持车牌识别,包含了android版app,微信小程序查询,响应式管理后台,云端大数据存储
  13. 用dos命令导出一个文件夹里面所有文件的名字(装逼利器)
  14. PHP页面间传值的几种方法
  15. 判断jquery对象是否具有某指定属性或者方法的几种方法
  16. ob_gzhandler — ob_start callback function to gzip output buffer
  17. 学习JAVA第一章的心得
  18. 【刷题】洛谷 P3573 [POI2014]RAJ-Rally
  19. 缓存-System.Web.Caching.Cache
  20. unix系统内核优点

热门文章

  1. antd-design-pro 服务代理问题
  2. 创建一个 Dynamic Web Project
  3. Linux入门-第八周
  4. 第三章JavaScript 内置对象
  5. jquery/js/a标签实现当前页面跳转的两种方法
  6. 如何禁止js缓存?
  7. C++多态实例
  8. Unidirectional TSP UVA - 116 多段图的最短路
  9. cut(树形DP)
  10. Maya建模命令