后缀数组一·重复旋律

时间限制:5000ms
单点时限:1000ms
内存限制:256MB

描述

小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的更多相关文章

  1. hiho一下123周 后缀数组四·重复旋律

    后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...

  2. hiho一下122周 后缀数组三·重复旋律

    后缀数组三·重复旋律3 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...

  3. hiho一下121周 后缀数组二·重复旋律2

    后缀数组二·重复旋律2 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...

  4. hiho一下120周 后缀数组一·重复旋律

    后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列. 小Hi ...

  5. hihoCoder 1403 后缀数组一·重复旋律(后缀数组+单调队列)

    #1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成 ...

  6. hihocoder #1419 : 后缀数组四·重复旋律4

    #1419 : 后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构 ...

  7. hihocoder #1415 : 后缀数组三·重复旋律3

    #1415 : 后缀数组三·重复旋律3 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...

  8. hihocoder #1407 : 后缀数组二·重复旋律2

    #1407 : 后缀数组二·重复旋律2 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...

  9. HihoCoder1415后缀数组三·重复旋律3

    重复旋律3 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi在练习过很多 ...

随机推荐

  1. RabbitMQ队列/Redis缓存

    一.RabbitMQ队列 RabbitMQ安装(Centos7安装):1.安装依赖:yum install socat (不安装会报错)2.下载rpm包:wget http://www.rabbitm ...

  2. Vimium~让您的Chrome起飞

    工欲善其事,必先利其器!撸起Vimium,我的Chrome就这么起飞了. 学起(了解几个快捷键即可)And撸起Vimium,想黑客一般在Chrome上飞起.Vimium常用快捷键(注:区分大小写)j, ...

  3. VC6.0中添加库文件和头文件

    附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在“ ...

  4. 019_Map Task数目的确定和Reduce Task数目的指定

    注意标题:Map Task数目的确定和Reduce Task数目的指定————自然得到结论,前者是后者决定的,后者是人为指定的.查看源码可以很容易看懂 1.MapReduce作业中Map Task数目 ...

  5. 活用:after 让图片垂直居中

    现在莫名虽然更喜欢 background 但大多时候还是选择用 img,这其中的利弊争议不在本文中赘述. 那么在布局中常会遇到定高容器中图片居中的需求,这时就有很多方法了呀: line-height ...

  6. BCM 交换机开发

    转:http://blog.chinaunix.net/uid-23782786-id-3839602.html 前言:        最近搞这玩样,真是折腾,网上的资料都是片段,而且很少.折腾了4. ...

  7. JSON.parse和JSON.stringify的作用

    //JSON.parse将字符串格式json转化为json对象 var str='{"name":"lingling","age":&quo ...

  8. 生信基础概念之unique reads VS multi-mapping reads

    unique reads:在参考组上只有一个匹配点 multi-mapping reads:在参考组上有多个匹配点 下面是tophat的一个结果案例: Reads: Input : Mapped : ...

  9. recovery 差分升级包制作超时【转】

    本文转载自:https://blog.csdn.net/csdn66_2016/article/details/73800349 我们在对android系统升级的时候,可以减少升级包的大小,只升级差异 ...

  10. 字符串问题之 去掉字符串中连续出现K个0的子串

    字符串中刚好出现K个连续的‘O’,则把K个连续‘O’字符去除,返回处理后的字符串 比如 str="AOOOOOBOOO"   k=3, 返回“AOOOOOB” 这个题的解决思路也有 ...