博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
后缀数组一·重复旋律
阅读量:5342 次
发布时间:2019-06-15

本文共 1575 字,大约阅读时间需要 5 分钟。

后缀数组一·重复旋律

时间限制:5000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。

小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律。旋律是一段连续的数列,相似的旋律在原数列可重叠。比如在1 2 3 2 3 2 1 中 2 3 2 出现了两次。

小Hi想知道一段旋律中出现次数至少为K次的旋律最长是多少?

输入

第一行两个整数 N和K。1≤N≤20000 1≤K≤N

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

输出

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

样例输入
8 212323231
样例输出
4

 

 

 

二分答案,判断height数组的值有没有连续m-1个大于等于mid的

1 #include
2 using namespace std; 3 typedef long long ll; 4 #define maxn 1000006 5 6 struct DA{ 7 int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; 8 int cmp(int *r,int a,int b,int l){ 9 return r[a]==r[b]&&r[a+l]==r[b+l];10 }11 12 void da(int *r,int *sa,int n,int m){13 int i,j,p,*x=wa,*y=wb,*t;14 for(i=0;i
=0;i--) sa[--ws[x[i]]]=i;18 19 for(j=1,p=1;p
=j) y[p++]=sa[i]-j;23 for(i=0;i
=0;i--) sa[--ws[wv[i]]]=y[i];29 30 for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i
=mid){53 co++;54 if(co>=m) return true;55 }56 else{57 co=1;58 }59 }60 return false;61 }62 63 int main(){64 #ifndef ONLINE_JUDGE65 freopen("input.txt","r",stdin);66 #endif67 std::ios::sync_with_stdio(false);68 cin>>n>>m;69 for(int i=0;i
>a[i];70 da.da(a,b,n+1,1005);71 da.calheight(a,b,n);72 int l=0,r=n,mid,tmp;73 int ans=0;74 while(l<=r){75 mid=l+r>>1;76 if(erfen(mid))l=mid+1;77 else r=mid-1;78 }79 cout<
<
View Code

 

转载于:https://www.cnblogs.com/Fighting-sh/p/10398047.html

你可能感兴趣的文章
# 20155209 2016-2017-2 《Java程序设计》第六周学习总结
查看>>
shell 脚本获取数组字符串长度
查看>>
Spark性能优化指南——基础篇
查看>>
Adapter 适配器模式 MD
查看>>
Linux使用fdisk进行磁盘管理
查看>>
Linux设置服务自启动(转载)
查看>>
ASP.Net文件下载-使用流输出
查看>>
限定textbox中只能输入数字的小方法
查看>>
Android 手机app 嵌入网页操作
查看>>
Android:控件布局(表格布局)TableLayout
查看>>
VMWare Workstation虚拟机网卡工作模式及配置方法
查看>>
开始学习Angular Mobile UI
查看>>
浅谈C语言中的联合体
查看>>
Photoshop独立安装包下载页面
查看>>
使用git获取远程分支
查看>>
.Net开发之Request处理
查看>>
看了才知道!伊朗黑客组织原来这么牛
查看>>
杂七杂八的一些板子
查看>>
读入优化模板
查看>>
linux 查看网络流量命令
查看>>