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个音符)

 
题解:
显然奇怪思想一遍AC:
可以做一个变换满足转调的要求,把每一个元素相邻作差,剩下的就是后缀数组乱搞了
显然满足abs(sa[i]-sa[j+1])>lcp(sa[i],sa[j+1]) 可以保证不重叠 且lcp>=4 满足题意
 #include <algorithm>
 #include <iostream>
 #include <cstdlib>
 #include <cstring>
 #include <cstdio>
 #include <cmath>
 using namespace std;
 ,INF=2e9;
 int gi(){
     ;char ch=getchar();
     ')ch=getchar();
     )+(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];
     ;
     ;
     return ri<rj;
 }
 void Getsa(){
     ;i<=n;i++){
         sa[i]=i;rk[i]=s[i];
     }
     ;k<=n;k<<=){
         sort(sa+,sa+n+,comp);
         ;i<=n;i++)tmp[sa[i]]=tmp[sa[i-]]+comp(sa[i-],sa[i]);
         ;i<=n;i++)rk[i]=tmp[i];
     }
 }
 void Gethight(){
     ,j;
     ;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;
     }
 }
 ;
 void Getanswer(){
     int t;
     ;i<n;i++){
         t=INF;
         for(int j=i;j<n;j++){
             if(high[j]<t)t=high[j];
             )break;
             ])>t && t>ans)ans=t;
         }
     }
     if(ans)
     printf();
     else printf("0\n");
 }
 int main()
 {
     freopen("theme.in","r",stdin);
     freopen("theme.out","w",stdout);
     n=gi();
     ;i<=n;i++)S[i]=gi();
     ;i<n;i++)s[i]=S[i+]-S[i]+;
     n--;Getsa();Gethight();Getanswer();
     ;
 }

[USACO 5.1.3]乐曲主题的更多相关文章

  1. COGS 902 乐曲主题 题解 &amp; hash入门贺

    [题意] 给定一个长为n的序列,元素都是不超过88的正整数,求序列中主题的最大长度. 所谓主题是指在序列中出现了至少两次并且不相交的子串.特别的,主题可以变调,也就是说如果一个子串全部加上或减去一个数 ...

  2. 洛谷P2743 乐曲主题Musical Themes [USACO5.1] SA

    正解:SA 解题报告: 传送门 这题三个条件嘛,那就一个个考虑下都解决了就把这题解决了嘛QwQ 那就直接分别针对三个条件写下各个击破就欧克辣? 1)长度大于等于5:求出答案之后和5比大小 2)不能有公 ...

  3. Luogu P2743 [USACO5.1]乐曲主题Musical Themes

    链接 \(Click\) \(Here\) 人生第一道后缀数组的题目.首先要对输入的串进行差分处理,差分后长度为(\(n - 1\))的相同子段就是原串中长度为\(n\)的相同(可变调)子段.求出来\ ...

  4. [USACO5.1] 乐曲主题Musical Themes

    题目链接:戳我 Emmm......hash怎么做啊不会啊 这里是SA后缀数组版本的 就是先两两做差分,作为要处理后缀的数组.普通地求出来h数组之后,我们二分这个答案,然后判定是否合法就行了.是否合法 ...

  5. 乐曲主题Musical Themes

    SA例题 题面 对于串 \(S\) 的两个子串 \(A\) 和 \(B\) ,满足 \(k = |A| = |B|\),\(\exists c \forall i\, a_i + c=b_i\),且 ...

  6. 学校作业-Usaco DP水题

    好吧,因为USACO挂掉了,所以我写的所有代码都不保证正确性[好的,这么简单的题,再不写对,你就可以滚粗了! 第一题是USACO 2.2.2 ★Subset Sums 集合  对于从 1 到 N 的连 ...

  7. P2743(poj1743) Musical Themes[差分+后缀数组]

    P2743 乐曲主题Musical Themes(poj1743) 然后呢这题思路其实还是蛮简单的,只是细节特别多比较恶心,忘记了差分带来的若干疏漏.因为转调的话要保证找到相同主题,只要保证一段内相对 ...

  8. 详解树莓派Model B+控制蜂鸣器演奏乐曲

    步进电机以及无源蜂鸣器这些都需要脉冲信号才能够驱动,这里将用GPIO的PWM接口驱动无源蜂鸣器弹奏乐曲,本文基于树莓派Mode B+,其他版本树莓派实现时需参照相关资料进行修改! 1 预备知识 1.1 ...

  9. Connect() 2016 大会的主题 ---微软大法好

    文章首发于微信公众号"dotnet跨平台",欢迎关注,可以扫页面左面的二维码. 今年 Connect 大会的主题是 Big possibilities. Bold technolo ...

随机推荐

  1. Oracle查询实用命令

    1.设置每行的长度: SET LIN[ESIZE] 200; 2.设置分页数量: SET PAGES[IZE] 50; 3.查看表空间相关信息: select file_id, tablespace_ ...

  2. Erlang之父的学习历史及学习建议

    当我开始学习编程的时候(1967年),我可以在 FORTRAN 和(传说中的)Algol 之间选择,不过没有任何人了解 Algol,所以我选择了 FORTRAN. 在我最早学习编程的时候,我的编程周期 ...

  3. js实现iframe自适应高度

    转自:http://www.jb51.net/article/15780.htm 对于自适应高度的代码有很多,可效率什么的考虑进来好代码就不多见了,不过思路倒是差不多的! 不带边框的iframe因为能 ...

  4. VPN服务器的配置与应用

      实验场景 通过将Linux配置VPN服务器允许远程计算机能够访问内网. 我的目的: 现在需要开发第三方接口,而第三方接口有服务器IP地址鉴权配置,这样在本地开发出来的程序每次都要发布到服务器上测试 ...

  5. MySQL 添加列,修改列,删除列

    创建后表的修改 alter table 语句用于创建后对表的修改, 基础用法如下: 添加列 基本形式: alter table 表名 add 列名 列数据类型 [after 插入位置]; 示例: 在表 ...

  6. springMVC在jsp传对象到后台

    ==============实体entity======================= package com.jb.pub.entity; import java.io.Serializable ...

  7. 一个简单的ORM制作(SQL帮助类)

    一个简单的ORM制作大概需要以下几个类: SQL执行类 CURD操作类 其他酱油类 先从SQL执行类说起,可能会涉及数据库的迁移等问题,所以需要定义一个接口以方便迁移到其他数据库, 事务没提供命名,若 ...

  8. tail -f -n 0 /var/log/messages

    <pre><font color="#CC0000"><b>root@kali</b></font>:<font ...

  9. RPMB原理介绍【转】

    本文转载自:https://blog.csdn.net/shenjin_s/article/details/79868375 RPMB介绍:RPMB(Replay Protected Memory B ...

  10. windows包管理器chocolatey

    1.安装chocolatey打开cmd.exe执行@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Obj ...