HihoCoder1407 后缀数组二·重复旋律2
重复旋律2
描述
小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律。
旋律可以表示为一段连续的数列,相似的旋律在原数列不可重叠,比如在1 2 3 2 3 2 1 中 2 3 2 出现了一次,2 3 出现了两次,小Hi想知道一段旋律中出现次数至少为两次的旋律最长是多少?
输入
第一行一个整数 N。1≤N≤100000
接下来有 N 个整数,表示每个音的数字。1≤数字≤1000
输出
一行一个整数,表示答案。
- 样例输入
-
8
1 2 3 2 3 2 3 1 - 样例输出
-
2
此题好像不能用单调队列,所以用二分。
#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 ans,N;
void solve()
{
int i,j;
for(i=;i<=N;i++) cntA[i]=;
for(i=;i<=N;i++) cntA[ch[i]]++;
for(i=;i<=N;i++) cntA[i]+=cntA[i-];
for(i=N;i>=;i--) sa[cntA[ch[i]]--]=i;//基数排序
Rank[sa[]]=;
for(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(i=;i<=N;i++) cntA[i]=cntB[i]=;
for(i=;i<=N;i++) cntA[A[i]=Rank[i]]++;
for(i=;i<=N;i++) cntB[B[i]=(i+L<=N)?Rank[i+L]:]++;
for(i=;i<=N;i++) cntA[i]+=cntA[i-];
for(i=;i<=N;i++) cntB[i]+=cntB[i-];
for(i=N;i>=;i--) tsa[cntB[B[i]]--]=i;//第二关键字排序
for(i=N;i>=;i--) sa[cntA[A[tsa[i]]]--]=tsa[i];//按第二关键字的顺序给第一关键字排序
Rank[sa[]]=;
for(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 (i=,j=;i<=N;i++)//得到高度
{
if(j) j --;
while (ch[i+j]==ch[sa[Rank[i]-]+j]) j++;
ht[Rank[i]]=j;
}
}
bool check(int x){
int Min=N,Max=;
for(int i=;i<=N;i++){
if(ht[i]<x){
if(Max!=&&Max-Min>=x)
return true;
Min=Max=sa[i];
continue;
}
Min=min(Min,sa[i]),Max=max(Max,sa[i]);
}
if(Max!=&&Max-Min>=x)
return true;
return false;
} void getMax()
{
int L=,R=N,mid;
while(L<=R)//注意这种写法是L<=R
{
mid=(L+R)/;
if(check(mid)) {ans=mid;L=mid+;}
else R=mid-;
}
}
int main()
{
scanf("%d",&N);
for(int i=;i<=N;i++) scanf("%d",&ch[i]);
solve();
getMax();
printf("%d\n",ans);
return ;
}
HihoCoder1407 后缀数组二·重复旋律2的更多相关文章
- hihocoder-1407 后缀数组二·重复旋律2 不重合 最少重复K次
后缀数组不能直接通过Height得出不重合的公共串.我们可以二分k值,这样连续的Height只要都大于等于k,那他们互相间的k值都大于等于k.每个这样的连续区间查找SA的最大最小值,做差判断是否重合( ...
- hiho一下121周 后缀数组二·重复旋律2
后缀数组二·重复旋律2 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...
- hihocoder #1407 : 后缀数组二·重复旋律2
#1407 : 后缀数组二·重复旋律2 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...
- hihoCoder #1445 : 后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
- hiho一下123周 后缀数组四·重复旋律
后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...
- hiho一下122周 后缀数组三·重复旋律
后缀数组三·重复旋律3 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...
- hiho一下120周 后缀数组一·重复旋律
后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列. 小Hi ...
- hihoCoder_1445_后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
- HihoCoder1403 后缀数组一·重复旋律1
后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列. 小Hi ...
随机推荐
- CentOS 6.4下OpenSSH升级到6.7操作
一.升级前准备 1.下载openssh-6.7p1.tar.gz: cd /usr/local/src/wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/ ...
- google黑客语法总结
搜索也是一门艺术 说起Google,可谓无人不知无人不晓,其强大的搜索功能,可以让你在瞬间找到你想要的一切.不过对于普通的用户而言,Google是一个强大的搜索引擎:而对于黑客而言,则可能是一款绝佳的 ...
- Loadrunner脚本篇——从文件中读取内容并参数化
直接代码展示: char* testfn() { int count, total = 0; char * buffer = NULL; int filelenth = 0; long file_st ...
- json教程系列(1)-使用json所要用到的jar包下载
json是个非常重要的数据结构,在web开发中应用十分广泛.我觉得每个人都应该好好的去研究一下json的底层实现,基于这样的认识,金丝燕网推出了一个关于json的系列教程,分析一下json的相关内容, ...
- MATLAB画图设置长宽。并高清复制
- Delphi 2005 以上版本GIF动画播放设置
源: Delphi 2005 以上版本GIF动画播放设置
- Python编程-函数进阶
一.函数对象 函数是第一类对象,即函数可以当作数据传递 1 可以被引用 2 可以当作参数传递 3 返回值可以是函数 4 可以当作容器类型的元素 def foo(): print('from foo') ...
- 关于C++ 中的this 的理解
关键字this 通常被用在一个class内部,指正在被执行的该class的对象(object)在内存中的地址.它是一个指针,其值永远是自身object的地址.
- SQL Server 字符串拼接与拆分 string varchar Split and Join
1.Split SQL Server 2008 新语法: DECLARE @str VARCHAR(MAX) SET @str = REPLACE(@teeIDs, ',', '''),(''' ...
- spark学习5(hbase集群搭建)
第一步:Hbase安装 hadoop,zookeeper前面都安装好了 将hbase-1.1.3-bin.tar.gz上传到/usr/HBase目录下 [root@spark1 HBase]# chm ...