【后缀数组】poj1743

动态欧拉角与静态欧拉角:从理论到实践的深度解析 本文深度解析了动态欧拉角与静态欧拉角的核心区别与应用场景。静态欧拉角基于固定世界坐标系,适用于全局导航与三维场景编辑;而动态欧拉角基于物体自身坐标系,更符合飞行模拟、机器人控制等直觉操作,但需警惕其固有的万向节死锁问题。文章通过理论结合实战,帮助开发者在机器人、无人机及图形学项目中正确选用与处理旋转表示。 阅读详情
Musical Theme

Description

A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the range 1..88, each representing a key on the piano. It is unfortunate but true that this representation of melodies ignores the notion of musical timing; but, this programming task is about notes and not timings. 
Many composers structure their music around a repeating &qout;theme&qout;, which, being a subsequence of an entire melody, is a sequence of integers in our representation. A subsequence of a melody is a theme if it: 
  • is at least five notes long 
  • appears (potentially transposed -- see below) again somewhere else in the piece of music 
  • is disjoint from (i.e., non-overlapping with) at least one of its other appearance(s)

Transposed means that a constant positive or negative value is added to every note value in the theme subsequence. 
Given a melody, compute the length (number of notes) of the longest theme. 
One second time limit for this problem's solutions! 

Input

The input contains several test cases. The first line of each test case contains the integer N. The following n integers represent the sequence of notes. 
The last test case is followed by one zero. 

Output

For each test case, the output file should contain a single line with a single integer that represents the length of the longest theme. If there are no themes, 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
0

Sample Output

5

题意:给一些数字串,当做韵律,相同的韵律必须满足:

    1,最少5个数字长;

    2,重复出现的时候,必须相对差值一样,比如{ 1 ,2, 3, 22, 10, 11, 12  },1,2,3与10 11 12是一样的韵律。

    3,韵律不可重叠。

其实就是求最长不重叠重复子串的长度(好绕~~)
求出height数组的值,然后二分……
将height 数组分成若干组,每组内height值都不小于x, 然后判断有没有组最长和最短的后缀相差不小于x
(貌似利用height数组分组的方式非常非常地常用)
NOI09年的论文里讲得很详细,就这样吧……


#include <iostream>
#include <cstdio>
#include <string>
#define N 20100
long n, m ;
long a[N], sa[N], rank[N], height[N], wa[N], wb[N], wv[N], ws[N];
bool cmp(long *r, long a, long b, long l)
{
    return ((r[a] == r[b]) && (r[a + l] == r[b + l]));
}

void calcsa(long *r, long *sa, long n, long m)
{
    long i ,j ,p, *x = wa, *y = wb, *t;

    for (i = 0; i < m; i++) ws[i] = 0;
    for (i = 0; i < n; i++) ws[x[i] = r[i]]++;
    for (i = 1; i < m; i++) ws[i] += ws[i - 1];
    for (i = n - 1; i >= 0; i--) sa[--ws[x[i]]] = i;

    for (j = 1, p = 1; p < n; j *= 2, m = p )
    {
        for (p = 0, i = n - j; i < n; i++) y[p++] = i;
        for (i = 0; i < n; i++) if (sa[i] >= j) y[p++] = sa[i] - j;

        for (i = 0; i < n; i++) wv[i] = x[y[i]];
        for (i = 0; i < m; i++) ws[i] = 0;
        for (i = 0; i < n; i++) ws[wv[i]]++;
        for (i = 1; i < m; i++) ws[i] += ws[i - 1];
        for (i = n - 1; i >= 0; i--) sa[--ws[wv[i]]] = y[i];
        t = x, x = y, y = t;
        p = 1; x[sa[0]] = 0;
        for (i = 1; i < n; i++)
        {
            x[sa[i]] = cmp(y, sa[i - 1], sa[i], j) ? p - 1 : p++;
        }
    }
}

void calcheight(long *r, long *sa, long n)
{

    long i, j, p = 0;
    for(i = 1; i <= n; i++)
        rank[sa[i]] = i;
    for(i = 0; i < n; i++)
    {
        j = sa[rank[i] - 1];
        while (r[i + p] == r[j + p])
        {
           // printf("%d %d\n", i, sa[i]);
            p++;
        }
        height[rank[i]] = p;
        if (p > 0) p--;
    }
    return;
}

bool check(long x)
{
    long minn = sa[1], maxn = sa[1];
    for (long i = 2; i <= n; i++)
    {
        if (height[i] >= x)
        {
            if (sa[i] < minn) minn = sa[i];
            if (sa[i] > maxn) maxn = sa[i];
            if ((maxn - minn) > x) return 1;
        }
        else minn = maxn = sa[i];
    }
    return 0;
}
void deal()
{
    long l = 0, r = n;
    while (l <= r)
    {
        long mid = (l + r) / 2;
        if (check(mid)) l = mid + 1;
        else r = mid - 1;
    }
    if(r >= 4) printf("%d\n", r+1);
      else printf("0\n");
}
int main()
{
   // freopen("poj1743.in", "r", stdin);
    while ((scanf("%d", &n) != EOF) && (n != 0))
    {
        long j, k;
        scanf("%d",&j);
        n--;

        for (long i = 0; i < n; i++)
        {

            scanf("%d", &k);
            a[i] = k - j + 100;
            j = k;
        }

        a[n] = 0 ;
        calcsa(a, sa, n + 1, 200);
        calcheight(a, sa, n);
        deal();
    }

    return 0;
}


Trustzone/TEE/安全 面试100问-目录 关键词:cache学习、mmu学习、cache资料、mmu资料、arm资料、armv8资料、armv9资料、 trustzone视频、tee视频、ATF视频、secureboot视频、安全启动视频、selinux视频,cache视频、mmu视频,armv8视频、armv9视频、FF-A视频、密码学视频、RME/CCA视频、学习资料下载、免费学习资料、免费 周贺贺,baron,代码改变世界ctw,Arm精选, 资深安全架构专家,十年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计 阅读详情

相关推荐

ROS2节点通信实战:用C++手写一个‘智能小车’控制模型(附完整代码)

本文详细介绍了如何使用ROS2和C++构建一个智能小车控制模型,涵盖运动控制节点、电池管理服务、参数动态配置和Rviz可视化等核心功能。通过实战项目演示ROS2节点通信机制,帮助开发者快速掌握机器人开发的关键技术,并提供了完整的代码实现和系统集成方案。

weixin_30607029的博客 261

poj1743(不可重叠最长重复子串,二分+后缀数组)

传送门 题目大意:不可重叠最长重复子串数 思路:二分+后缀数组 与poj3261很像,不过是不可重叠 显然答案具有单调性,假设最长长度为x 我们对后缀们进行分组,height >= x且rank连续的后缀分在一组,rank连续是因为只有连续才能使后缀的重复率最高。height>=x是因为要满足长度大于x。 转化一下题意,二分x,是否存在两个长度为x的子串不重叠,我们利用sa数组来判重叠,两个子串abs(sa[i] - sa[j]) > x即存在,由于同一组里可能有多个满足条件的

m0_53688600的博客 622

2025数学建模国赛A题1-4问详解(论文+完整代码)

本文介绍了数学建模国赛A题的解题思路,重点分析了三维遮蔽模型的建立和运动学代码实现。相比第一题,第二题增加了未知参数求解,需要采用遗传算法等非线性优化方法。文章强调该模型由专业团队原创开发,代码可运行,并提醒参赛者警惕市场上的保奖班现象。整体内容聚焦于竞赛解题技巧和原创性保证。

Eloveeeee的博客 2799

poj1743(后缀数组+二分)

不可重叠最长重复子串 后缀数组后,二分最长长度,在维护长度不小于mid时,判断是否有两个位置之间的差>mid,表示不重叠,由此更新l,r #include #include #include #include #include using namespace std; const int N=20050; const int inf=0x3f3f3f3f; inline int read(

zhhx2001的博客 620

超详细流式细胞术全流程解析:从样本制备到结果分析全攻略

流式细胞术(Flow Cytometry)是现代生物学和医学研究中不可或缺的高通量分析技术,可实现对细胞表型、功能状态、细胞周期等多维度参数的快速检测。本文将从实验全流程出发,详解样本制备、上机操作、参数设置及结果处理的核心要点,帮助科研人员精准掌握流式实验关键技术。

good_rrrrr的博客 3868

ISO26262 功能安全各个阶段测试要求

1. 开发过程说明 系统层面:包括软硬件集成测试、系统集成测试以及整车测试。 硬件层面:包括硬件集成与测试。 软件层面:单元测试、集成测试。 2. 功能安全总体要求 2.1 各项指标 2.2 诊断覆盖度举例 针对一个信号举例说明: 3. 功能安全测试要求 3.1 测试计划 核心内容应包括, 测试对象:需要测试的对象描述,以及测试的范围描...

AgingMoon的博客 1万+

POJ1743(不可重叠最长重复子串 SA+二分)

题目 题意: 给你n个数字代表此时的钢琴按键。问最长的重复的节拍。 就转化为n-1个值得不可重叠最长重复子串。题目要求节拍对应的串>=5 意思就是这个最长重复节拍应>=4。 思路: 二分答案这个子串最长为mid(下面用k),先然满足二分单调性。 将n个后缀按字典序排列后,然后将公共前缀长度>=mid得放到一个小组里。 而且这个小组得分配是唯一的。 一组任意两串的的最长公共前缀都&...

qq_42576687的博客 415

ESP32驱动MLX90640红外热成像传感器:从报错到成功运行的完整避坑指南

本文是一份详细的ESP32驱动MLX90640红外热成像传感器的实战指南。针对开发中常见的I2C通信失败、数据全零及‘坏点过多’等报错,文章提供了从环境搭建、驱动库选择与改造到实战代码解析的完整解决方案,并分享了数据滤波、热图生成及多任务优化等高级技巧,帮助开发者高效避坑,实现稳定运行。

weixin_29191669的博客 94

poj 1743(后缀数组)

题意:给出一个数字序列,然后问这个序列的变化幅度的不重叠的最长重复子串。 题解:先把这个序列前后相差值计算出来,得到真正要找的最长重复子串的序列。方法是先用DA得到sa数组,然后算出height[i]:名次相邻的两个后缀串的最长公共前缀。用二分枚举最长重复子串的长度x,判断就是只要连续的heighti出现了大于等于x(重复长度)且相差超过x(不重叠),那么这个x就是有效的,二分出满足条件的最大值就

俯瞰风景 606

手把手教你学PCIE(10.5)--PCIE故障排除方法的分步排查法介绍

通过以上分步排查法,你可以系统地诊断和解决 PCIe 设备的故障。每个步骤都有助于逐步缩小问题范围,最终找到并解决问题。

MHD0815的博客 1873

Python 爬虫实战:手机应用商店评论数据爬取与分析

移动应用市场蓬勃发展,用户的评论数据包含了大量有价值的信息,如用户满意度、功能反馈、改进建议等。通过分析这些评论,我们可以挖掘应用的优缺点,甚至预测用户趋势。由于 Apple App Store 评论是动态加载的,我们使用。本篇博客将详细介绍如何使用 Python 爬取。爬取大量数据时,可能会遇到反爬机制。库获取 Google Play 评论。评论数据是动态加载的,需要使用。

2201_76125261的博客 2322

Poj 1743 后缀数组

第一次写后缀数组,熟练一下模板。纠结了很久正负1的问题,大概是这样的:字符串从0开始,长度为n,在后面加一个0,这个0在build_sa里是要算上的,算rank的时候也要算上的,但是显然这个最后0的rank是0,所以为了简写,直接在算height的时候略过了,但我觉得直接统一一下,所有的数组都算上,然后加个if特判一下,这样比较好记也不太容易搞混。然后吐槽下lrj的白书,缺少了很多细节的解释,对初学

ACM, deep love 560

OpenClaw 保姆级 window部署

OpenClaw 保姆级 window部署 养龙虾

cs821984831的博客 297

poj1743 后缀数组入门题

题目链接:http://poj.org/problem?id=1743 //poj1743 #include<cstdio> #include<algorithm> #include<iostream> #include<cmath> #include<cstdlib> #include<cstring> #inc...

甦萌的博客 273

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

poj 1743 Musical Theme 后缀数组

poj 1743 Musical Theme题目:给一串音符,要你找出一段美妙音符,要满足下面三个条件。1.长度要大于52.没有重叠3.两个串中对应的元素的差值是一个定值 样例:124 5 6 7 8 50 9 10 11 12 13 14 红色和蓝色的的差值为5,思路:其实这个题是求最长不重复子串,当然很容易想到后缀数组的height数组。直接用输入的这个数组显然是不行的,因为他们有个固定的差值。这个题需要转换一下,用后一项减去前一项,这么构造一个新的数组:1 1 1 1  42 -41 1 1

Euler_M 763

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

poj 1743 Musical Theme 较为简单的后缀数组+高度数组的应用

传送门:poj 1743 Musical Theme题目大意题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题。“主题”是整个音符序列的一个子串,它需要满足如下条件: 1. 长度至少为5个音符。 2. 在乐曲中重复出现。(可能经过转调,“转调”的意思是主题序列中每个音符都被加上或减去了同一个整数值) 3. 重复

woshinannan的专栏 1669

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

poj 1743 Musical Theme(后缀数组)

后缀数组第一题,RE好多次,看了好多题解,最终在discuss里找到了正解:http://poj.org/showmessage?message_id=341423 代码里是先做差再求height数组,原因是题目中的转置,两个数字都加上一个相同的量,两个数字之间的差值也是不会变的。 题目的思路是看的:算法合集之《后缀数组——处理字符串的有力工具》这里面的,这个是里面的例题。。。#includ

梦幻的蔷薇色 925

[后缀数组]poj1743 Musical Theme

poj1743——Musical Theme一句话题意就是:给定一个字符串,求最长重复子串,这两个子串不能重叠。首先因为N太大了(1<=N<=20000),所以我们可以考虑用后缀数组算法分析: 先二分答案,把题目变成判定性问题:1、判断是否存在两个长度为k的子串是相同的;2、不重叠。先将后缀进行进行基数排序,把排序后的后缀分成若干组,其中每组的后缀之

kkkGIGi_qtt 343

POJ 1743 Musical Theme(后缀数组)

POJ 1743 Musical Theme(后缀数组) http://poj.org/problem?id=1743 题意:给你一个长为n的数字序列,要你求出该序列中最长的满足下面要求的序列长度:原序列中存在不重叠的两个序列,这两个序列长度相同且将第一个序列的所有数字加上某个常数可以得到第二个序列. 分析:本题可见罗穗骞《后缀数组——处理字符串的有力工具》.        首先我们要求的

code 1289

poj 1743 Musical Theme (后缀数组)

poj 1743 Musical Theme 题意: 有N个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题。“主题”是整个音符序列的一个子串,它需要满足如下条件: 1.长度至少为5个音符。 2.在乐曲中重复出现。(可能经过转调,“转调”的意思是主题序列中每个音符都被加上或减去了同一个整数值) 3.重复出现的同一主题不能有公共部分。 限制:

whai的专栏 689

POJ 1743 Musical Theme 后缀数组

题目:http://poj.org/problem?id=1743 题意:给定一个数组,求不重叠的最长相同变化的长度 思路:后缀数组第一题。看后缀数组看了一天,整个人都懵逼了,找了一道基础的后缀数组题切一下。。。这道题是利用height数组的性质,height数组代表排名为i和i-1的后缀子串的最长公共前缀长度,公共前缀即是相同的变化。二分枚举答案,判断height数组大于等于枚举值的两起点间

弱智就要多努力 650

后缀数组+最长公共前缀(LCS)+最长重复出现的不重叠字串(POJ 1743)

这几天一直在研究后缀数组,说实在,到现在还没有完全研究透。今天终于参考各种资料和代码,仿照别人的写出了一个求后缀数组和最长公共前缀的代码,记下来主要是为了将来复习。1,有关后缀数组的理论介绍就不介绍了,可以参考罗穗骞和许智磊两位大牛的论文。2,网上实现很多,但是我没有找到注释比较详细的实现,我这里主要结合代码给出详细的注释和需要注意的细节。  下面结合POJ 1743给出代码和注释

ClearRiver 's Style 3546

POJ - 1743 Musical Theme 后缀数组 二分

题目链接: POJ-1743 Musical Theme 题目大意一个数组有n个元素, 求最长重复出现(不重叠)的子串的长度, 要求长度大于等于5, 并且如果一个串每个数字加上同一个值等于另一个子串, 视这两个子串相同(1 2 3和4 5 6相同)思路相邻元素作差得到另一个数组, 然后就化简成了求一般的最长重复出现的子串长度了 对新数组求高度数组, 高度数组有一个特性, 其大小变化一定是大->小,

litmxs的博客 298

poj1743Musical Theme - 后缀数组

题目链接:http://poj.org/problem?id=1743 题目大意:有N(1<=N<=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的子串,它需要满足如下条件:1.长度至少为5个音符。 2.在乐曲中重复出现(就是出现过至少两次)。(可能经过转调,“转调”的意思是主题序列中每个音符都被加上或减去了同一个整数...

136

poj 1743 Musical Theme(不可重叠的最长重复子串,后缀数组)

题目:http://poj.org/problem?id=1743 题目大意:就是给你 n 个数字,现在要选取一个子串作为主题,要求,这个主题的长度要 >= 5,然后重复的主题直接不能有重叠的地方, 还有,如果这个主题区间的所有数字加上或减掉某一个数 k 和另外一段区间相等,那么也算是重复出现,然你输出这个最大的长度,如果不存在, 就输出0。 思路:首先先解决加上减掉一个数匹配的问题,我感

沉溺的专栏 864

POJ 1743:后缀数组求 不重叠最长重复子串

题意:给出一个数列,每个数字在[ 1 , 88 ]之间,每个数字对应钢琴的一个按键。定义相同的旋律为:[ i , i+len-1 ]区间 和 [ j , j+len-1 ]区间对应位置每个字符,差值恒定相等,且这两个区间不想交。就是说第一个区间每个数字加上一个delta,会变成第二个区间。求最长的旋律长度,如果小于5,输出0.否则输出最长的相同旋律的长度。 题解:考虑查分数列。两段旋律相

辣鸡葫芦娃 578
上一篇: 【后缀数组】poj3261
下一篇: 【后缀数组】poj1226
荷塘涟漪
博客等级 码龄16年 36粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值