题目:Musical Theme

#include <stdio.h>
#include <string.h>
#define N 1000010
int wa[N],wb[N],wv[N],ws[N];
int rank[N],height[N];
int sa[N],r[N];
int max(int a,int b)
{
return a>b? a:b;
}
int min(int a,int b)
{
return a<b? a:b;
}
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=0; i<m; i++) ws[i]=0;
for(i=0; i<n; i++) ws[x[i]=r[i]]++;
for(i=1; i<m; i++) ws[i]+=ws[i-1];
for(i=n-1; i>=0; i--) sa[--ws[x[i]]]=i;
for(p=1,j=1; p<n; j*=2,m=p)
{
for(p=0,i=n-j; 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++) ws[i]=0;
for(i=0; i<n; i++) ws[wv[i]]++;
for(i=1; i<m; i++) ws[i]+=ws[i-1];
for(i=n-1; i>=0; i--)
sa[--ws[wv[i]]]=y[i];
for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1; i<n; i++ )
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
}
void calheight(int *r,int *sa,int n)
{
int i,j,k=0;
for(i=1; i<=n; i++)
rank[sa[i]]=i;
for(i=0; i<n; height[rank[i++]]=k)
for(k?k--:0,j=sa[rank[i]-1]; r[i+k]==r[j+k]; k++);
}
bool check(int k,int n)
{
int i;
int min_val=sa[1],max_val=sa[1];
for(i=2;i<=n;i++)
{
if(height[i]<k) min_val=sa[i],max_val=sa[i];
else
{
min_val=min(min_val,sa[i]);
max_val=max(max_val,sa[i]);
if(max_val-min_val>=k) return true;
}
}
return false;
}
int Binary(int st,int ed,int n)
{
int l=st,r=ed,mid;
while(l<r)
{
mid=(l+r+1)/2;
if(check(mid,n)) l=mid;
else             r=mid-1;
}
return l;
}
int main()
{
int i,n,a,b;
while(~scanf("%d",&n),n)
{
scanf("%d",&b);
for(i=0;i<n-1;i++)
{
scanf("%d",&a);
r[i]=a-b+88;
b=a;
}
r[n-1]=0;
da(r,sa,n,300);
calheight(r,sa,n-1);
n--;
int ans=Binary(0,n/2,n);
if(ans>=4) printf("%d\n",ans+1);
else       puts("0");
}
return 0;
}

poj1743(后缀数组+二分--不可重叠最长重复子串)相关推荐

  1. 后缀数组--(可重叠最长重复子串问题)

    问题描述:给定一个字符串,求最长重复子串,这两个子串可以重叠. 其实问题可以转化为height数组的最大值.至于为什么是这样,我可以这样解释: 求可重叠最长重复子串等价于求两个后缀的最长公共前缀的最大 ...

  2. #1407 : 后缀数组二·重复旋律2 (不可重叠最长重复子串问题)

    题目链接 思路 求不可重叠最长重复子串,也可以利用height[i]height[i]height[i]. 二分枚举答案KKK 当height[i]≥Kheight[i] \ge Kheight[i] ...

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

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

  4. Musical Theme POJ - 1743(后缀数组+二分)

    求不可重叠最长重复子串 对于height[i]定义为sa[i]和 sa[i-1]的最长公共前缀 这个最长公共前缀的值肯定是最大的 证明: 设rank[j] < rank[k], 则不难证明后缀j ...

  5. 试题 算法训练 后缀数组——最长重复子串

    资源限制 时间限制:100ms 内存限制:256.0MB 问题描述 给定一个长度为n的数串,求至少出现k 次的最长重复子串的长度,这k 个子串可以重叠.保证有子串出现至少k次. 输入格式 第一行:两个 ...

  6. 后缀数组求最长重复子串

    问题描述 给定一个字符串,求出其最长重复子串 例如:abcdabcd 最长重复子串是 abcd,最长重复子串可以重叠 例如:abcdabcda,这时最长重复子串是 abcda,中间的 a 是被重叠的. ...

  7. 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...

    最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和 文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathi ...

  8. POJ1743——不可重迭的最长重复子串

    题意:给定一系列的整数作为音阶,旋律为相邻音阶之差.问最长的主旋律是多长,主旋律需满足3个条件: 1. 长度至少为5: 2. 至少重复出现2次: 3. 主旋律各不重迭. 对源进行变换以后,就是问不重迭 ...

  9. LeetCode 1062. 最长重复子串(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定字符串 S,找出最长重复子串的长度.如果不存在重复子串就返回 0. 示例 1: 输入:"abcd" 输出:0 解释:没有重复子串. ...

最新文章

  1. msql查询指定日期
  2. adprw指令通讯案例_S7-1200与S7-300傻瓜式通讯
  3. python中的pandas的两种基本使用_pandas中join()的两种应用方法
  4. 自动化交易综述——互联网金融
  5. Java线程池:ThreadPoolExecutor运行原理
  6. 摇杆控制方向原理_图文全面讲解多种方向控制阀的原理和区别....
  7. 【转】Mac系统中安装homebrew(类似redhat|Centos中的yum;类似Ubuntu中的apt-get)
  8. java xmpp消息推送_基于XMPP协议(openfire服务器)的消息推送实现
  9. linux 周期性任务,Linux任务计划,周期性任务执行详解
  10. WayOs内置智能重启:自动计算UTC时间为本地时间,可以调整为几时重启
  11. 过滤器(Filter)与拦截器(Interceptor )区别
  12. 有监督学习、无监督学习和半监督学习的分类
  13. 发票OCR识别验真接口简介
  14. python求平均数直到0出现while_Python第一周 学习笔记(2)
  15. oracle官文查看参数介绍的路径
  16. JZOJ1321 灯
  17. Windows11 Docker-Compose 因为挂载问题报错
  18. Building 'xxx' Gradle project info
  19. MATLAB基本使用方法
  20. 大神偷偷收藏的7个自学网站,质量高且免费,请低调使用

热门文章

  1. MIME Type描述消息内容类型的因特网标准
  2. 阿里云OSS-对象存储流程梳理演示
  3. 单点登录Redis存储Session及SessionId问题说明与集群实战-4
  4. 基本的SQL-SELECT语句练习
  5. 单例设计模式-反射攻击解决方案及原理分析
  6. 编程开发使用的辅助软件大全
  7. DESIGN_OUTLINE' and 'CUTOUT' are the preferred subclasWARNING
  8. J-LINK不能烧写(错误:JLink Warning: RESET (pin 15) high, but should be low. Please check target)
  9. 七个你没用过的炫酷开发工具推荐
  10. 安装Xcode在Mac OS X10.7.3上