【后缀数组】poj1743

vscode+keil嵌入式软件开发全流程 阅读详情
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;
}


大模型测试人员完整学习体系(分层成长路线 + 知识框架 + 落地实操) 本文系统构建了大模型测试工程师的4级能力成长体系:L1(测试执行)-L2(专项测试)-L3(质量体系)-L4(行业标准),详细拆解了每个阶段的核心技能图谱。重点包括:入门层需掌握传统测试基础和大模型产品逻辑;进阶层需精通Prompt用例设计、RAG测试、安全对齐、自动化评测等专项能力;高级层聚焦评测平台搭建与质量体系建设;专家层深入算法对齐与行业标准制定。文章配套提供了分阶段技术工具栈、3-12个月学习路径及5类实战项目建议,形成了一套完整的大模型测试人才能力培养框架。 阅读详情

相关推荐

FFmpeg实战:5分钟搞定m3u8视频下载与ts文件合并(附完整命令)

本文详细介绍了如何使用FFmpeg快速下载m3u8视频并合并ts文件为mp4格式。通过简洁的命令行操作,读者可以轻松完成视频处理任务,包括环境准备、链接获取、下载合并及性能优化等实用技巧,特别适合需要高效处理流媒体内容的用户。

weixin_30836759的博客 221

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

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

m0_53688600的博客 622

SAP预扣税配置实战:从BP创建到外部接口集成的完整流程

本文详细拆解了SAP S/4HANA中预扣税配置与集成的完整实战流程。内容涵盖从业务伙伴(BP)架构下的数据存储理解、后台基础配置,到针对批量处理场景,如何绕过标准BAPI,采用直接更新核心表LFBW的策略进行高效开发。最后,文章探讨了与外部接口集成的多种模式与数据流设计,为财务顾问和ABAP开发人员提供了一套清晰、可落地的解决方案。

weixin_29204749的博客 415

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

HttpClient跳过HTTPS证书验证的3种实战方法(含完整代码示例)

本文详细介绍了HttpClient跳过HTTPS证书验证的3种实战方法,包括自定义TrustManager、SSLContext配置和HttpClientBuilder高级定制,并提供完整代码示例。这些方法适用于开发和测试环境,帮助开发者快速解决自签名证书或未认证证书导致的HTTPS请求失败问题,但需注意生产环境的安全风险。

weixin_29213655的博客 530

ADC电路项目1——10bit SAR ADC 设计,smic18工艺,有工艺库,有效位数ENOB为9.8

包括详细仿真文档,原理介绍,完整电路图,仿真参数已设好,可直接使用,在自己的电脑上就可以运行仿真。本设计采用 smic18mmrf CMOS 工艺,使用栅压自举电路的采样开关,Vcm-based 开关。电容开关控制电路,10 位 DFF,最后用 10 位理想 DAC 模块将数字码转换为 10 进制量进。时序上级板采样的 DAC 电容阵列,两级动态比较器,比较器异步时钟,SAR 动态逻辑,DAC。10bit SAR ADC 设计,smic18工艺,有工艺库,有效位数ENOB为9.8。

qq_48407979的博客 814

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

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

qq_42576687的博客 415

洛奇 服务器文件,MabinogiG20S2 [洛奇G20服务端]

Code:Titles:>set_title /id: /add /remove Parameters for titles>set_title /id:60001 /add add devcat title>set_title /id:60001 /remove remove devcat title===========================...

weixin_30813385的博客 4304

poj 1743(后缀数组)

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

俯瞰风景 606

9.1 机器人动力学建模

目录9.1 机器人动力学建模一、机器人动力学的基本概念1. 什么是机器人动力学?2. 动力学方程二、机器人动力学建模方法1. 拉格朗日方法2. 牛顿-欧拉方法三、Simulink 中的机器人动力学建模1. 使用 Simscape Multibody 建模示例:构建一个两连杆机械臂的动力学模型。步骤:2. 使用 Robotics System Toolbox 建模示例:构建一个六自由度工业机器人的动力学模型。步骤:四、示例:两连杆机械臂的动力学建模目标:步骤:五、结果分析1. 动态响应2. 参数敏感性六、总结

xiaoheshang_123的博客 626

杰理SDK UART 使用教程

本文介绍了JL701n芯片的UART串口通信使用教程,重点讲解了UART2的初始化配置、数据收发和中断处理功能。教程详细说明了代码结构、核心功能函数、配置参数和使用步骤,包括UART初始化、数据发送和接收中断处理等关键操作。同时提供了完整的API接口说明和注意事项,强调了中断处理限制、缓冲区管理、引脚配置等重要细节。最后给出了基本使用流程和高级任务处理示例,并针对常见问题提供了故障排除建议。本教程适用于需要在JL701n芯片上实现可靠串口通信的开发者。

qq_42014563的博客 1818

Poj 1743 后缀数组

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

ACM, deep love 560

《拉依达的嵌入式\驱动面试宝典》—Linux篇(八)_Linux驱动编程

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 319

poj1743 后缀数组入门题

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

甦萌的博客 273

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

woshinannan的专栏 1669

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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、付费专栏及课程。

余额充值