[USACO 5.1.3]乐曲主题
Description
我们用N(1 <= N <=5000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,每个数表示钢琴上的一个键。很不幸这种表示旋律的方法忽略了音符的时值,但这项编程任务是关于音高的,与时值无关。
许多作曲家围绕一个重复出现的“主题”来构建乐曲。在我们的乐曲表示法中,“主题”是整个音符序列的一个子序列,它需要满足如下条件:
长度至少为5个音符
在乐曲中重复出现(可能经过转调,见下)
重复出现的同一主题不能重叠
“转调”的意思是主题序列中每个音符都被加上或减去了同一个整数值。
给定一段乐曲,计算其中最长主题的长度(即音符数)。
Input
第一行包含整数N。
下面的每一行(最后一行可能除外)包含20个整数,表示音符序列。最后一行可能少于20个音符。
Output
输出应只含一个整数,即最长主题的长度。如果乐曲中没有主题,那么输出0。
Sample Input
30
25 27 30 34 39 45 52 60 69 79 69 60 52 45 39 34 30 26 22 18
82 78 74 70 66 67 64 60 65 80
Sample Output
5
Hint
样例提示:
(这个长度为5的主题是输入文件中第一行的最后5个音符和第二行开头5个音符)
- #include <algorithm>
- #include <iostream>
- #include <cstdlib>
- #include <cstring>
- #include <cstdio>
- #include <cmath>
- using namespace std;
- const int N=,INF=2e9;
- int gi(){
- int str=;char ch=getchar();
- while(ch>'' || ch<'')ch=getchar();
- while(ch>='' && ch<='')str=(str<<)+(str<<)+ch-,ch=getchar();
- return str;
- }
- int n,k,S[N],s[N],rk[N],sa[N],tmp[N],high[N];
- bool comp(int i,int j){
- if(rk[i]!=rk[j])return rk[i]<rk[j];
- int ri=i+k<=n?rk[i+k]:-;
- int rj=j+k<=n?rk[j+k]:-;
- return ri<rj;
- }
- void Getsa(){
- for(int i=;i<=n;i++){
- sa[i]=i;rk[i]=s[i];
- }
- for(k=;k<=n;k<<=){
- sort(sa+,sa+n+,comp);
- for(int i=;i<=n;i++)tmp[sa[i]]=tmp[sa[i-]]+comp(sa[i-],sa[i]);
- for(int i=;i<=n;i++)rk[i]=tmp[i];
- }
- }
- void Gethight(){
- int h=,j;
- for(int i=;i<=n;i++){
- j=sa[rk[i]-];
- if(h)h--;
- for(;j+h<=n && i+h<=n;h++)if(s[j+h]!=s[i+h])break;
- high[rk[i]-]=h;
- }
- }
- int ans=;
- void Getanswer(){
- int t;
- for(int i=;i<n;i++){
- t=INF;
- for(int j=i;j<n;j++){
- if(high[j]<t)t=high[j];
- if(t<)break;
- if(abs(sa[i]-sa[j+])>t && t>ans)ans=t;
- }
- }
- if(ans)
- printf("%d\n",ans+);
- else printf("0\n");
- }
- int main()
- {
- freopen("theme.in","r",stdin);
- freopen("theme.out","w",stdout);
- n=gi();
- for(int i=;i<=n;i++)S[i]=gi();
- for(int i=;i<n;i++)s[i]=S[i+]-S[i]+;
- n--;Getsa();Gethight();Getanswer();
- return ;
- }
[USACO 5.1.3]乐曲主题的更多相关文章
- COGS 902 乐曲主题 题解 & hash入门贺
[题意] 给定一个长为n的序列,元素都是不超过88的正整数,求序列中主题的最大长度. 所谓主题是指在序列中出现了至少两次并且不相交的子串.特别的,主题可以变调,也就是说如果一个子串全部加上或减去一个数 ...
- 洛谷P2743 乐曲主题Musical Themes [USACO5.1] SA
正解:SA 解题报告: 传送门 这题三个条件嘛,那就一个个考虑下都解决了就把这题解决了嘛QwQ 那就直接分别针对三个条件写下各个击破就欧克辣? 1)长度大于等于5:求出答案之后和5比大小 2)不能有公 ...
- Luogu P2743 [USACO5.1]乐曲主题Musical Themes
链接 \(Click\) \(Here\) 人生第一道后缀数组的题目.首先要对输入的串进行差分处理,差分后长度为(\(n - 1\))的相同子段就是原串中长度为\(n\)的相同(可变调)子段.求出来\ ...
- [USACO5.1] 乐曲主题Musical Themes
题目链接:戳我 Emmm......hash怎么做啊不会啊 这里是SA后缀数组版本的 就是先两两做差分,作为要处理后缀的数组.普通地求出来h数组之后,我们二分这个答案,然后判定是否合法就行了.是否合法 ...
- 乐曲主题Musical Themes
SA例题 题面 对于串 \(S\) 的两个子串 \(A\) 和 \(B\) ,满足 \(k = |A| = |B|\),\(\exists c \forall i\, a_i + c=b_i\),且 ...
- 学校作业-Usaco DP水题
好吧,因为USACO挂掉了,所以我写的所有代码都不保证正确性[好的,这么简单的题,再不写对,你就可以滚粗了! 第一题是USACO 2.2.2 ★Subset Sums 集合 对于从 1 到 N 的连 ...
- P2743(poj1743) Musical Themes[差分+后缀数组]
P2743 乐曲主题Musical Themes(poj1743) 然后呢这题思路其实还是蛮简单的,只是细节特别多比较恶心,忘记了差分带来的若干疏漏.因为转调的话要保证找到相同主题,只要保证一段内相对 ...
- 详解树莓派Model B+控制蜂鸣器演奏乐曲
步进电机以及无源蜂鸣器这些都需要脉冲信号才能够驱动,这里将用GPIO的PWM接口驱动无源蜂鸣器弹奏乐曲,本文基于树莓派Mode B+,其他版本树莓派实现时需参照相关资料进行修改! 1 预备知识 1.1 ...
- Connect() 2016 大会的主题 ---微软大法好
文章首发于微信公众号"dotnet跨平台",欢迎关注,可以扫页面左面的二维码. 今年 Connect 大会的主题是 Big possibilities. Bold technolo ...
随机推荐
- spring mvc 整合Quartz
Quartz是一个完全由java编写的开源作业调度框架.不要让作业调度这个术语吓着你.尽管Quartz框架整合了许多额外功能, 但就其简易形式看,你会发现它易用得简直让人受不了!Quartz整合在sp ...
- 结合Socket实现DDoS攻击
一.实验说明 1. 实验介绍 通过上一节实验的SYN泛洪攻击结合Socket实现DDoS攻击. 2. 开发环境 Ubuntu Linux Python 3.x版本 3. 知识点 本次实验将涉及以下知识 ...
- Swift - 使用导航条和导航条控制器来进行页面切换并传递数据
转自:http://www.hangge.com/blog/cache/detail_586.html
- 自己写编程语言-m语言
一直对技术有很强的兴趣,终于,决定要写自己的语言(m语言).那就先从最简单的开始:解释执行器. 一套完整的语言包含的肯定不止解释执行器了,还要有编译器和IDE,也就还要有语法高亮.智能提示等,不过还没 ...
- python之路--day13---函数--三元表达式,递归,匿名函数,内置函数-----练习
1.文件内容如下,标题为:姓名,性别,年纪,薪资 egon male 18 3000 alex male 38 30000 wupeiqi female 28 20000 yuanhao female ...
- 深度学习之 mnist 手写数字识别
深度学习之 mnist 手写数字识别 开始学习深度学习,先来一个手写数字的程序 import numpy as np import os import codecs import torch from ...
- Web Api 接收图片
public async Task<HttpResponseMessage> Upload() { if (!Request.Content.IsMimeMultipartContent( ...
- Python内置函数(63)——property
英文文档: class property(fget=None, fset=None, fdel=None, doc=None) Return a property attribute. fget is ...
- Python内置函数(61)——eval
英文文档: eval(expression, globals=None, locals=None) The arguments are a string and optional globals an ...
- 20165226 2017-2018-4 《Java程序设计》第6周学习总结
20165226 2017-2018-4 <Java程序设计>第6周学习总结 教材学习内容总结 第八章 常用实用类 string类 并置 两个常量进行并置,得到的仍是常量. public ...