HihoCoder1403 后缀数组一·重复旋律1
后缀数组一·重复旋律
描述
小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。
小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律。旋律是一段连续的数列,相似的旋律在原数列可重叠。比如在1 2 3 2 3 2 1 中 2 3 2 出现了两次。
小Hi想知道一段旋律中出现次数至少为K次的旋律最长是多少?
输入
第一行两个整数 N和K。1≤N≤20000 1≤K≤N
接下来有 N 个整数,表示每个音的数字。1≤数字≤100
输出
一行一个整数,表示答案。
- 样例输入
-
8 2
1
2
3
2
3
2
3
1 - 样例输出
-
4
后缀数组得到相邻公共前缀长度。
单调队列得到区间最小值。
多写几遍感觉后缀数组也没那么难了。
之前分享了一点后缀数组的资料,http://www.cnblogs.com/hua-dong/p/7751828.html。而且感觉后缀数组处理字符串最为强大,所以我在字符串处理工具中给它单独分组。马拉车,KMP都还比较好写,ac自动机和后缀数组真的就,要多写才行。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int Rank[maxn],cntA[maxn],cntB[maxn],A[maxn],B[maxn];
int ch[maxn],sa[maxn],tsa[maxn],ht[maxn];
int q[maxn],pos[maxn],head,tail,ans,N,K;
void solve()
{
for (int i = ; i<N; i ++) cntA[i] = ;
for (int i = ; i<=N; i ++) cntA[ch[i]] ++;
for (int i = ; i<N; i ++) cntA[i] += cntA[i - ];
for (int i = N; i; i --) sa[cntA[ch[i]] --] = i;
Rank[sa[]] = ;
for (int i = ; i <= N; i ++)
{
Rank[sa[i]] = Rank[sa[i - ]];
if (ch[sa[i]] != ch[sa[i - ]]) Rank[sa[i]] ++;
}
for (int l = ; Rank[sa[N]] < N; l <<= )
{
for (int i = ; i <= N; i ++) cntA[i] = ;
for (int i = ; i <= N; i ++) cntB[i] = ;
for (int i = ; i <= N; i ++)
{
cntA[A[i] = Rank[i]] ++;
cntB[B[i] = (i + l <= N) ? Rank[i + l] : ] ++;
}
for (int i = ; i <= N; i ++) cntB[i] += cntB[i - ];
for (int i = N; i; i --) tsa[cntB[B[i]] --] = i;
for (int i = ; i <= N; i ++) cntA[i] += cntA[i - ];
for (int i = N; i; i --) sa[cntA[A[tsa[i]]] --] = tsa[i];
Rank[sa[]] = ;
for (int i = ; i <= N; i ++)
{
Rank[sa[i]] = Rank[sa[i - ]];
if (A[sa[i]] != A[sa[i - ]] || B[sa[i]] != B[sa[i - ]]) Rank[sa[i]] ++;
}
}
for (int i = , j = ; i <= N; i ++)
{
if (j) j --;
while (ch[i + j] == ch[sa[Rank[i] - ] + j]) j ++;
ht[Rank[i]] = j;
}
}
void getMax()//单调队列
{
int i,j;
for(i=;i<=N;i++)
{
while(head<=tail-&&ht[i]<q[tail]) tail--;
q[++tail]=ht[i];
pos[tail]=i;
if(i-pos[head]>=K) head++;
if(i-pos[head]<K&&q[head]>ans) ans=q[head];
}
}
int main()
{
int i,j;
scanf("%d%d",&N,&K);
K--;//height是两两比较,代表的是区间,所以要减一。
for(i=;i<=N;i++) scanf("%d",&ch[i]);
solve();
getMax();
printf("%d\n",ans);
return ;
}
(事实上,我觉得这个单调队列写得有问题,甚至在自己都知道写的时候这么想的,AC之后就没管了,现在想起来,是不是有些问题,但是还是不明白怎么AC的,难度是对的?)
HihoCoder1403 后缀数组一·重复旋律1的更多相关文章
- hiho一下123周 后缀数组四·重复旋律
后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...
- hiho一下122周 后缀数组三·重复旋律
后缀数组三·重复旋律3 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...
- hiho一下121周 后缀数组二·重复旋律2
后缀数组二·重复旋律2 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...
- hiho一下120周 后缀数组一·重复旋律
后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列. 小Hi ...
- hihoCoder 1403 后缀数组一·重复旋律(后缀数组+单调队列)
#1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成 ...
- hihocoder #1419 : 后缀数组四·重复旋律4
#1419 : 后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构 ...
- hihocoder #1415 : 后缀数组三·重复旋律3
#1415 : 后缀数组三·重复旋律3 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...
- hihocoder #1407 : 后缀数组二·重复旋律2
#1407 : 后缀数组二·重复旋律2 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...
- HihoCoder1415后缀数组三·重复旋律3
重复旋律3 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi在练习过很多 ...
随机推荐
- Python学习进程(5)Python语法
本节介绍Python的基本语法格式:缩进.条件和循环. (1)缩进: Python最具特色的是用缩进来标明成块的代码. >>> temp=4;x=4; >> ...
- 无法处理文件 MainForm.resx,因为它位于 Internet 或受限区域中,或者文件上具有 Web 标记。要想处理这些文件,请删除 Web 标记
无法处理文件 MainForm.resx,因为它位于 Internet 或受限区域中,或者文件上具有 Web 标记.要想处理这些文件,请删除 Web 标记 问题: 由于文件锁定,VS不能正常读取. 解 ...
- 40个你可能不知道的Python的特点和技巧
1.拆箱 >>> a, b, c = 1, 2, 3 >>> a, b, c (1, 2, 3) >>> a, b, c = [1, 2, 3] ...
- Python编程-网络编程
一.Socket复习 1.Socket参数 sk.bind(address) 必会 s.bind(address) 将套接字绑定到地址.address地址的格式取决于地址族.在AF_INET下,以元组 ...
- @MarkFan 口语练习录音 20140401
Hi,everybody 对于未来,我只梦想最好的情况, 并定下最踏实的计划,而绝不花时间在无谓的担心上, 因为我知道,只要把我对自己的承诺付诸实践, 我的未来将不会只是一个梦…… 这是引用考拉小巫的 ...
- 12.常见模块time、json模块
1.time模块 import time #python中最基本的时间模块 time.time() #时间戳 (1970年1月1日00:00:00后经过的浮点秒数) time.localtime(ti ...
- 源代码中直接package edu.princeton.cs.algs4还是import edu.princeton.cs.algs4问题
对于前者这个问题,直接在src目录下命名一个包:edu.princeton.cs.algs4 即创建了文件:src->edu->princeton->cs->algs4,然后把 ...
- java基础学习总结——java环境变量配置(转)
只为成功找方法,不为失败找借口! 永不放弃,一切皆有可能!!! java基础学习总结——java环境变量配置 前言 学习java的第一步就要搭建java的学习环境,首先是要安装 JDK,JDK安装好之 ...
- Struts2全局异常处理
1.在struts.xml中配置全局异常处理 在Action中抛出异常,此异常可以是action自己抛的,也可以是Service抛出来的,都会跳转到全局异常中,只有在当前Action中配置域全局异常返 ...
- c#.NET中日志信息写入Windows日志中解决方案
1. 目的应用系统的开发和维护离不开日志系统,选择一个功能强大的日志系统解决方案是应用系统开发过程中很重要的一部分.在.net环境下的日志系统解决方案有许多种,log4net是其中的佼佼者.在Wind ...