【POJ No. 1743】音乐主题 Musical Theme

news2024/11/29 0:34:31

【POJ No. 1743】音乐主题 Musical Theme

北大OJ 题目地址

在这里插入图片描述

【题意】音乐旋律被表示为N (1≤N ≤20000)个音符的序列,它们是[1, 88]内的整数,每个音符都代表钢琴上的一个键。许多作曲家都围绕一个重复的主题谱写音乐,该主题属于整个旋律的子序列。旋律的子序列是一个主题,若满足至少5个音符而且在音乐片段的其他地方再次出现(不重叠,但可能存在转换,转换是指该子序列中的每个音符都同时加上或减去一个值),则给定一个旋律,计算最长主题的长度(音符数)。

【输入输出】

输入:

输入包含多个测试用例,每个测试用例的第1行都包含整数N 。以下N 个整数表示音符序列。最后一个测试用例后跟一个0。

输出:

对每个测试用例,都单行输出最长主题的长度。若没有主题,则输出0。

【样例】

在这里插入图片描述

【思路分析】

这道题求解的是不重叠、长度大于或等于5的最长重复子串的长度,可以先转变为子串问题,再采用后缀数组及二分法求解。

因为主题子序列可能同时加上或减去一个数,如34 30 26 22 18,若同时加上48,则转换为82 78 74 70 66,因此可以将数字序列逐项求差,转变为普通的子串问题。在差值序列上求解不重叠、长度大于或等于4的最长重复子串的长度ans,因为求差序列比原序列长度少1,所以需要输出ans+1。

例如,对输入样例数据逐项求差后(从第2个开始,每个数都减去前一个数),序列如下:

在这里插入图片描述

不重叠长度大于或等于4的最长重复子串为-4-4-4-4,其长度为4,原序列是34 30 26 22 18,长度为5。

【算法设计】

① 逐项求差,将问题转变为普通的求子串问题。

② 求解sa数组。

③ 求解rank数组和height数组。

④ 使用二分法求解,对特定的长度mid,判断是否满足height[i ]≥mid,且sa的最大、最小差值也大于或等于mid(保证不重叠)。

【算法实现】

#include<cstdio>
#include<algorithm>

using namespace std;

const int maxn=20010;
const int maxm=200;
int n,k; 
int s[maxn],ss[maxn],sa[maxn],rank[maxn],height[maxn];;
int wa[maxn],wb[maxn],wv[maxn],c[maxm];

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,k,p,*x=wa,*y=wb;
    for(i=0;i<m;i++) 
        c[i]=0;
    for(i=0;i<n;i++) 
        c[x[i]=r[i]]++;
    for(i=1;i<m;i++) 
        c[i]+=c[i-1];
    for(i=n-1;i>=0;i--) 
        sa[--c[x[i]]]=i;
    for(k=1;k<=n;k<<=1){
        //直接利用sa排序第二关键字 
		p=0;
		for(i=n-k;i<n;i++) 
            y[p++]=i;//补零的位置下标排在最前面 
        for(i=0;i<n;i++)
            if(sa[i]>=k)
                y[p++]=sa[i]-k;
        //基数排序第一关键字
        for(i=0;i<n;i++)
            wv[i]=x[y[i]];//将第二关键字排序结果转换为名次,进行排序 
        for(i=0;i<m;i++)
            c[i]=0;
        for(i=0;i<n;i++)
            c[wv[i]]++;
        for(i=1;i<m;i++)
            c[i]+=c[i-1];
        for(i=n-1;i>=0;i--)
            sa[--c[wv[i]]]=y[i];
		//根据sa和x数组,重新计算新的x数组
        swap(x,y);//y数组已经没有用,更新x需要使用x本身数据,因此放入y使用 
		p=1,x[sa[0]]=0;
        for(i=1;i<n;i++)
            x[sa[i]]=cmp(y,sa[i-1],sa[i],k)?p-1:p++;
    	if(p>=n)//排序结束 
    		break;
    	m=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;i++){
    	if(k)
    		k--;
    	j=sa[rank[i]-1];
    	while(r[i+k]==r[j+k])
    		k++;
    	height[rank[i]]=k;
	}
}

bool check(int mid){
	int mx=sa[1],mn=sa[1];
	for(int i=2;i<=n;i++){
		if(height[i]>=mid){
			mx=max(mx,sa[i]);
			mn=min(mn,sa[i]);
			if(mx-mn>=mid)
				return 1;
		}	
		else{
			mx=sa[i];
			mn=sa[i];
		}
	}
	return 0;
}

void solve(){
	int L=4,R=n,res=-1;
	while(L<=R){
		int mid=(L+R)>>1;
		if(check(mid)){
			res=mid;
			L=mid+1;
		}
		else
			R=mid-1;
	}
	if(res<4)
		printf("0\n");
	else
		printf("%d\n",res+1);
}

int main(){
	
	while(~scanf("%d",&n),n){
		for(int i=0;i<n;i++)
			scanf("%d",&s[i]);
		if(n<9){
			printf("0\n");
			continue;
		}
		n--;
		for(int i=0;i<n;i++)
			ss[i]=s[i+1]-s[i]+100;

		ss[n]=0;
		da(ss,sa,n+1,200);
		calheight(ss,sa,n);

		solve();
	}
	
	return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

建木HA部署

背景 在建木v2.6.1之前&#xff0c;建木Server仅支持单机部署&#xff0c;如果出现单机故障&#xff0c;难以应用于在线场景&#xff0c;并且单机压力过大时&#xff0c;会影响系统延展性。 什么是HA HA&#xff08;High Availability Cluster&#xff09;是高可用集群系统的…

【软件测试】开发人员不鸟自己?看看资深测试如何做的......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试人员经常抱怨开…

jsp+servlet+mysql实现的新闻发布管理系统源码+运行教程+文档

今天给大家演示一下一款由jsp servlet mysql实现的新闻发布管理系统&#xff0c;主要实现了前台游客浏览新闻、评论新闻&#xff0c;后台管理员管理新闻等功能&#xff0c;新闻有热点新闻、最新更新等方式在首页展示&#xff0c;还有幻灯片展示重大新闻等功能&#xff0c;满足了…

一招解决开发环境问题——远程容器开发指南

前言 使用C作为主要开发语言的程序猿们应该会认同搭建开发环境是一件烦人的事情。为了编译一个程序不仅需要下载各种依赖包&#xff0c;还可能面临本地系统不兼容、编译器版本不一致、包版本冲突等各种问题。笔者在运营iLogtail开源社区的过程中发现开发和调试环境问题也是成员…

web网页设计期末课程大作业——HTML+CSS+JavaScript美食餐饮文化主题网站设计与实现

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

为云原生插上翅膀,天翼云弹性存储CStor-CSI助力容器腾飞

云原生是一种新型技术体系&#xff0c;已成为云计算未来的发展方向&#xff0c;越来越多的数字化项目与云原生紧密相连。作为云原生的基座&#xff0c;容器是必不可少的核心技术。然而&#xff0c;以Docker为代表的容器引擎&#xff0c;并不能满足大批量的容器业务需求&#xf…

推荐一套yyds的Java学习资料(非常经典)

Java 是全球最受欢迎的编程语言之一&#xff0c;在世界编程语言排行榜 TIOBE 中&#xff0c;Java 一直霸占着前三名&#xff0c;有好多年甚至都是第一名。 最近几年&#xff0c;全球约有 1/3 的专业程序员将 Java 作为主要编程语言&#xff0c;这一比例在我国更是高达 1/2&…

CTFSHOW web入门 java反序列化篇 web855

web855 得到源码后看到readObject里面有两条路可以走 1、写文件&#xff0c;文件名固定&#xff0c;文件内容开头固定后面内容可以通过write写入 2、执行命令&#xff0c;但是shellcodoe是不可控的&#xff08;static&#xff09; 如果两条路分开来看都没啥可利用的价值&…

ai绘画新功能上线,说一句话就能生成好看的AI画作

ai绘画可以将自己的图片生成二次元&#xff0c;还可以通过关键词描述生成好看的画作&#xff0c;这些我们都早已尝试过了&#xff0c;并且也玩得不亦乐乎&#xff0c;但AI绘画还能进行语音创作&#xff0c;只需要同AI说一句话&#xff0c;它就能创造出相关的画作&#xff0c;所…

【Linux开发笔记】VSCode+WSL——Windows搭建最轻量便捷的Ubuntu/Linux开发环境

1.概述 我们一般搭建Ubuntu开发环境都是采用VMware或者VirtualBox的虚拟机安装Ubuntu的方案&#xff0c;但是这样的方案会有几个弊端&#xff1a; 安装、启动慢&#xff1b;使用图形桌面时卡顿、鼠标不跟手、打字有延迟&#xff1b;磁盘空间占用比较大&#xff1b;内存资源占用…

安卓开发Android studio学习笔记21:ViewPager两种方式实现引导页

实现引导页一、ViewPager实现引导页第一步&#xff1a;创建三个xml1.page1.xml2.page2.xml3.page3.xml第二步&#xff1a;创建适配器GuideAdapter第三步&#xff1a;创建引导页原点1.activity_guide.xml2.GuideActivity.java二、 ViewPager&#xff08;2&#xff09;实现引导页…

[附源码]Node.js计算机毕业设计电影售票管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Docker中的bridge模式,可以这么设置

最近有几个已经就业的小伙伴&#xff0c;过来问千锋健哥关于Docker网络配置的问题&#xff0c;他们在实际开发中还是有些疑问。关于Docker网络这一块的内容确实很多&#xff0c;为了让大家搞清楚这个问题&#xff0c;健哥准备搞几篇系列文章&#xff0c;来为各位小伙伴解惑。这…

小游戏开发者流量变现指南

2018年微信在其6.6.1版本中宣布支持小游戏&#xff0c;之后的几年&#xff0c;但凡能掀起各大社交平台上病毒式传播的&#xff0c;几乎都是小游戏。 小游戏玩法简单&#xff0c;传播机制简单&#xff0c;套路简单&#xff0c;连赚钱的本质也简单。就拿近期火爆的《羊了个羊》小…

程序员也可以很浪漫,精选10个圣诞节特效及源码

最近离圣诞节不远了、整理了一些关于圣诞相关的前端特效网页设计和小游戏的代码送大家、直接上效果吧。 代码过长的 可预览获取 圣诞节快乐 - 文字渐入动画 <body><svg viewport"0 0 300 300"><text class"Merry" x"150" y&qu…

货淋室及货通道维护要点有哪些

货淋室及货淋通道维护要点&#xff0c;货淋室是货物进入洁净室所必需的通道&#xff0c;它可以减少货物进出洁净室所带来的污染问题。 货淋室及货淋通道维护要点&#xff1a; 1、定期使用仪器测定设备的各项技术指标&#xff0c;如不符合技术参数要求应及时予以处理。 2、根…

高低jdk版本中jndi注入(下)

目录 0x01 绕过高版本JDK&#xff08;8u191&#xff09;限制 如下两种绕过方式&#xff1a; 0x02 利用本地恶意Class作为Reference Factory 2.1 攻击利用 1. 服务端 2. 服务端 2.2 几种变体的表达式 调试分析 小结 0x03 利用LDAP返回序列化数据&#xff0c;触发本地Gadg…

nacos--基础--5.1--集成--SpringCloud--配置管理、服务发现、服务注册

nacos–基础–5.1–集成–SpringCloud–配置管理、服务发现、服务注册 代码位置 https://gitee.com/DanShenGuiZu/learnDemo/tree/master/nacos-learn/nacos-spring-cloud1、介绍 主要面向 Spring 的使用者通过2个实例&#xff0c;来介绍nacos和Spring的集成 配置管理服务注册…

运行时发现文件路径输出404

运行时发现文件路径输出404 tomcat不能显示中文原因主要是编码的问题&#xff0c; 因为Tomcat5的http Connector所用的URI解码默认用的是 ISO-8859-1&#xff0c; 而一般浏览器默认用的发送编码为UTF-8&#xff0c;这样问题就出现了&#xff0c; 初步的解决方法如下&#xff1a…

Mentor-dft 学习笔记 day40-Basic Test Data Formats for Patterns

Reduce Serial Loading Simulation Time with Sampling 使用write_patterns命令时&#xff0c;可以使用-sample开关保存完整pattern集的样本。这将减少pattern文件中的pattern数量&#xff0c;从而减少模拟时间。此外&#xff0c;-Sample开关允许您控制样本中包含的每种类型的p…