#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 30000
using namespace std;
int n;
int jilu[maxn];
int wa[maxn],wb[maxn],wv[maxn],ws[maxn],r[maxn],sa[maxn],rankk[maxn],height[maxn];//r数组是将原始字符串进行整数化
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){//待排序字符串长度是n,从0开始,最大是m-1
int i,j,p,*x=wa,*y=wb,*t;
for(i=;i<m;i++)ws[i]=;
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++;
}
}
void calheight(int *r,int *sa,int n){
int i,j,k=;
for(i=;i<=n;i++) rankk[sa[i]]=i;
for(i=;i<n;height[rankk[i++]]=k)
for(k?k--:,j=sa[rankk[i]-];r[i+k]==r[j+k];k++);
return;
}
bool ok(int mid){
int mmax=-,mmin=;
for(int i=;i<n;i++){
if(height[i]<mid){
if(mmax-mmin>=mid)return ;
mmax=sa[i];
mmin=sa[i];
}
mmax=max(sa[i],mmax);
mmin=min(sa[i],mmin);
}
if(mmax-mmin>=mid)return ;
else return ;
}
int main()
{
while(scanf("%d",&n)!=EOF){
if(n==)break;
for(int i=;i<n;i++){
scanf("%d",&jilu[i]);
if(i>)r[i-]=jilu[i]-jilu[i-]+;
}
r[n-]=;
da(r,sa,n,);
calheight(r,sa,n-);
int l=,r=n;
while(l<=r){
int mid=(l+r)>>;
if(ok(mid))l=mid+;
else r=mid-;
}
r++;
if(r<)r=;
printf("%d\n",r);
}
}

POJ 1743 后缀数组不重叠最长重复子串的更多相关文章

  1. POJ 1743 (后缀数组+不重叠最长重复子串)

    题目链接: http://poj.org/problem?id=1743 题目大意:楼教主の男人八题orz.一篇钢琴谱,每个旋律的值都在1~88以内.琴谱的某段会变调,也就是说某段的数可以加减一个旋律 ...

  2. [Poj1743] [后缀数组论文例题] Musical Theme [后缀数组不可重叠最长重复子串]

    利用后缀数组,先对读入整数处理str[i]=str[i+1]-str[i]+90这样可以避免负数,计算Height数组,二分答案,如果某处H<lim则将H数组分开,最终分成若干块,判断每块中是否 ...

  3. [poj 3693]后缀数组+出现次数最多的重复子串

    题目链接:http://poj.org/problem?id=3693 枚举长度L,看长度为L的子串最多能重复出现几次,首先,能出现1次是肯定的,然后看是否能出现两次及以上.由抽屉原理,这个子串出现次 ...

  4. POJ 1743 Musical Theme 后缀数组 不可重叠最长反复子串

    二分长度k 长度大于等于k的分成一组 每组sa最大的和最小的距离大于k 说明可行 #include <cstdio> #include <cstring> #include & ...

  5. poj 1743 男人八题之后缀数组求最长不可重叠最长重复子串

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14874   Accepted: 5118 De ...

  6. POJ 1743 Musical Theme(不可重叠最长重复子串)

    题目链接:http://poj.org/problem?id=1743 题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一 ...

  7. 【poj1743-Musical Theme】不可重叠最长重复子串-后缀数组

    http://poj.org/problem?id=1743 这题是一道后缀数组的经典例题:求不可重叠最长重复子串. 题意: 有N(1 <= N <=20000)个音符的序列来表示一首乐曲 ...

  8. POJ-1743 Musical Theme 字符串问题 不重叠最长重复子串

    题目链接:https://cn.vjudge.net/problem/POJ-1743 题意 给一串整数,问最长不可重叠最长重复子串有多长 注意这里匹配的意思是匹配串的所有元素可以减去或者加上某个值 ...

  9. poj 3261 后缀数组 可重叠的 k 次最长重复子串

    Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 16430   Accepted: 7252 Ca ...

随机推荐

  1. kindle相关工具

    里是与 Kindle 电子书相关的工具软件.它们可以帮助我们解决在日常使用电子书时所可能遇到的问题,比如 kindle 管理工具.kindle 转换工具.kindle电子书制作工具.kindle 推送 ...

  2. ORA-12519, TNS:no appropriate service handler found

    解决问题: 有时候连不上数据库是因为连接数到了极限了. select count(*) from v$process --当前的连接数 130 select value from v$paramete ...

  3. ORACLE 常用数值函数

    1 ABS(n)返回数值弄参数的绝对值.它接受一个数值型值作为输入参数,或者任何可以隐式地转换为数值型值的值.并且返回数值型值的绝对值. Select abs(-1) from dual ABS(-1 ...

  4. 程序员书单_sshi框架篇

    Struts2权威指南完整版 http://download.csdn.net/detail/shenzhq1980/9103955 精通struts.基于MVC的.java.web设计与开发http ...

  5. <新手必读>Eclipse中,Add Jars与Add Library的区别

    Eclipse中,工程属性的Java Build Path的Library标签页下,有如下几个按钮:Add Jars...添加JAR包,是指本Eclipse当前包含的工程中的,在工程列表下选取即可Ad ...

  6. 51nod1369 无穷印章

    有一个印章,其完全由线段构成.这些线段的线足够细可以忽略其宽度,就像数学上对线的定义一样,它们没有面积.现在给你一张巨大的白纸(10亿x10亿大小的纸,虽然这个纸很大,但是它的面积毕竟还是有限的),你 ...

  7. Axure RP

    Axure RP是一个专业的快速原型设计工具.Axure(发音:Ack-sure),代表美国Axure公司:RP则是Rapid Prototyping(快速原型)的缩写. Axure RP是美国Axu ...

  8. IE浏览器的兼容模式代码细节解读

    兼容性对于网页设计师来说非常重要.虽然最好是建立一个完全不需依赖任何网页浏览器特性或功能的网站,但是有时候这是不可能实现的.而文件兼容模式能将网页限制在某个特定版本的IE中.可以使用 X-UA-Com ...

  9. 分析MySQL慢日志(转)

    使用 MySQL自带命令 mysqldumpslow 查看 OPTIONS -s ORDER ORDER, 主要有 c, t, l, r 和 ac, at, al, ar, 分别是按照 query次数 ...

  10. 4. 对list进行sort

    一. sort命令 sort命令可以对list排序 sort命令把字段转先换为double类型在进行比较 sort排序list 127.0.0.1:6379> lrange list2 0 -1 ...