博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Musical Theme
阅读量:4493 次
发布时间:2019-06-08

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

题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题。“主题”是整个音符序列的一个子串,它需要满足如下条件:

    1.长度至少为5个音符。

    2.在乐曲中重复出现。(可能经过转调,“转调”的意思是主题序列中每个音符都被加上或减去了同一个整数值)

    3.重复出现的同一主题不能有公共部分。

/*    改了三个小时,还是没有改出来,WA到挺了。    说一下解题过程吧。    二分答案,然后按照公共前缀长度是否大于等于mid分组,若有一组中的间距大于mid,则说明找到了一组符合要求的。 */#include
#include
#include
#define N 51000using namespace std;int ch[N],s[N],sa[N],rank[N],height[N],t1[N],t2[N],c[N];bool cmp(int *y,int a,int b,int k){ return y[a]==y[b]&&y[a+k]==y[b+k];}void DA(int n,int m){ int *x=t1,*y=t2; for(int i=0;i
=k) y[p++]=sa[i]-k; for(int i=0;i
=n) break; } for(int i=0;i
mid) return true; minn=n+1;maxn=-1; } minn=min(minn,sa[i]); maxn=max(maxn,sa[i]); } if(maxn-minn>mid) return true; return false;}void CL(){ memset(s,0,sizeof(s)); memset(sa,0,sizeof(sa)); memset(rank,0,sizeof(rank)); memset(height,0,sizeof(height)); memset(t1,0,sizeof(t1)); memset(t2,0,sizeof(t2)); memset(ch,0,sizeof(ch)); memset(c,0,sizeof(c));}int main(){ int n; while(scanf("%d",&n)&&n){ CL(); for(int i=0;i
>1; if(check(n,mid)) l=mid+1,ans=mid; else r=mid-1; } ans++; ans=ans<5?0:ans; printf("%d\n",ans); } return 0;}

 

转载于:https://www.cnblogs.com/harden/p/6539724.html

你可能感兴趣的文章
MAVEN学习-第一个Maven项目的构建
查看>>
Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)
查看>>
jQuery的deferred对象详解
查看>>
JUnit4 入门笔记
查看>>
利用相关的Aware接口
查看>>
设计模式—建造者模式
查看>>
2-6
查看>>
猜拳游戏项目(涉及知识点Scanner、Random、For、数组、Break、Continue等)
查看>>
centos 6.3 编译安装 nginx +mysql + php
查看>>
<Web> 如何给web项目添加redis服务
查看>>
百度地图
查看>>
倒计时
查看>>
Spark shuffle详细过程
查看>>
rhel6.4 zabbix 安装时少的bcmath mbstring
查看>>
day 7 编码
查看>>
Epicor客户化控件介绍——EpiCombo
查看>>
css
查看>>
自制浮动静态路由实验(简单)
查看>>
JDK和Eclipse的下载路径
查看>>
[DeviceOne开发]-土地销售项目源码分享
查看>>