Description

小 Hi 平时的一大兴趣爱好就是演奏钢琴。 我们知道一个音乐旋律被表示为长度为 N的数构成的数列。 
小 Hi 在练习过很多曲子以后发现很多作品中的旋律有重复的部分。 
我们把一段旋律称为( k , l )-重复的, 如果它满足由一个长度为 l 的字符串重复了 k 次组成。 如旋律 abaabaabaaba 是(4,3)重复的, 因为它由 aba 重复 4 次组成。 
小 Hi 想知道一部作品中 k 最大的(k,l)-重复旋律。

Input

一行一个仅包含小写字母的字符串 。 字符串长度不超过 100000。

Output

一行一个整数, 表示答案 k。

Sample Input

babbabaabaabaabab

Sample Output

4

Hint

数据约束: 
30%的数据 N<=1000 
70%的数据 N<=10000 
100%的数据 N<=100000

题解:

容易想到判断循环结延伸的长度就是i和i+k(k为循环结长度)的lcp,求两个后缀的lcp显然就是高度数组对应的一段的最小值

RMQ维护即可 

接着就是难点,我们不必枚举每一个位置,只需枚举k的倍数

但是可能存在情况:使得i+l i+l+1  (1<=l<=k)使得次数大了1

但是显然我们可以O1的找出这个位置的答案 即为 lcp(i-k+R%k,i+R%k)  R为lcp(i,i+k) 可以画个图理解下

R%k是求出lcp不能形成新循环的多出来的一段 那么我们就直接求lcp即可

 #include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int N=;
int s[N],n=,rk[N],sa[N],tmp[N],k;char S[N];
bool comp(int i,int j){
if(rk[i]!=rk[j])return rk[i]<rk[j];
int ri=i+k<=n?rk[i+k]:-;
int rj=j+k<=n?rk[j+k]:-;
return ri<rj;
}
void Getsa(){
for(int i=;i<=n;i++){
sa[i]=i;rk[i]=s[i];
}
for(k=;k<=n;k<<=){
sort(sa+,sa+n+,comp);
tmp[sa[]]=;
for(int i=;i<=n;i++)tmp[sa[i]]=tmp[sa[i-]]+comp(sa[i-],sa[i]);
for(int i=;i<=n;i++)rk[i]=tmp[i];
}
}
int high[N];
void Gethight(){
int j,h=;
for(int i=;i<=n;i++){
j=sa[rk[i]-];
if(h)h--;
for(;i+h<=n && j+h<=n;h++)if(s[i+h]!=s[j+h])break;
high[rk[i]-]=h;
}
}
int f[N][];
int query(int l,int r){
int k=log(r-l+)/log();
return min(f[l][k],f[r-(<<k)+][k]);
}
void prework(){
int to;
for(int i=;i<=n;i++)f[i][]=high[i];
for(int j=;j<=;j++){
for(int i=;i<=n-(<<j)+;i++){
to=i+(<<(j-));
if(f[i][j-]<f[to][j-])f[i][j]=f[i][j-];
else f[i][j]=f[to][j-];
}
}
}
int lcp(int x,int y){
if(rk[x]>rk[y])swap(x,y);
return query(rk[x],rk[y]-);
}
int main()
{
//freopen("pp.in","r",stdin);
scanf("%s",S);
for(int i=,sz=strlen(S);i<sz;i++)
s[++n]=S[i]-'a'+;
Getsa();
Gethight();
prework();
int ans=,to;
for(int g=;g<=n;g++){
for(int i=;i+g<=n;i+=g){
to=lcp(i,i+g);
ans=max(ans,to/g+);
if(i-g+(to%g)>=){
ans=max(lcp(i-g+to%g,i+to%g)/g+,ans);
}
}
}
printf("%d\n",ans);
return ;
}

【hihoCoder 1419】重复旋律4的更多相关文章

  1. hihocoder 1419 重复旋律4

    描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi在练习过很多曲子以后发现很多作品中的旋律有重复的部分. 我们把一段旋律称为(k,l)-重复的, ...

  2. hihocoder 1407 重复旋律2

    思路: 二分一哈答案 height分个块 //By SiriusRen #include <cstdio> #include <cstring> #include <al ...

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

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

  4. 【简要题解】Hihocoder 重复旋律1-9简要题解

    [简要题解]Hihocoder 重复旋律1-8简要题解 编号 名称标签 难度 1403 后缀数组一·重复旋律 Lv.4 1407 后缀数组二·重复旋律2 Lv.4 1415 后缀数组三·重复旋律3 L ...

  5. hihoCoder 后缀数组 重复旋律

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

  6. HihoCoder 重复旋律

    あの旋律を何度も繰り返しでも.あの日見た光景を再現できない 无论将那段旋律重复多少次,也无法重现那一日我们看到的景象 もし切ないならば.時をまきもどしてみるかい? 若是感到惆怅的话,要试着让时光倒流吗 ...

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

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

  8. hihoCoder 后缀自动机三·重复旋律6

    后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi ...

  9. hihoCoder #1445 : 后缀自动机二·重复旋律5

    #1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...

随机推荐

  1. python利用twilio模块给自己发短信

    1.访问http://twilio.com/并填写注册表单.注册了新账户后,你需要验证一个手机号码,短信将发给该号码. 2.Twilio 提供的试用账户包括一个电话号码,它将作为短信的发送者.你将需要 ...

  2. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  3. 完美解决某法院HP EVA8400删除VDISK问题

    [故障描述] 某地法院一台HP EVA8400存储,2组扩展柜,物理磁盘由12个1T FATA磁盘(AG691A 454414-001)和10个300G 15K FC磁盘(AG690A 454411- ...

  4. The method getTextContent() is undefined for the type Node

    eclipse 中 如果加入了 其他了xfire 等其他xml解析包的话,使用org.w3c.dom.Node下的getTextContent()方法会出现The method getTextCont ...

  5. 【深度学习】深入理解Batch Normalization批标准化

    这几天面试经常被问到BN层的原理,虽然回答上来了,但还是感觉答得不是很好,今天仔细研究了一下Batch Normalization的原理,以下为参考网上几篇文章总结得出. Batch Normaliz ...

  6. 用nodejs 开发的智能提示

    用nodejs 开发的智能提示 时间:2014-07-01 03:50:18 类别:搜索引擎 访问: 2576 次 感谢:http://lutaf.com/223.htm 智能提示对于搜索非常重要,相 ...

  7. vuex - 项目结构目录及一些简单配置

    首先先正经的来一段官网的"忠告": vuex需要遵守的规则: 一.应用层级的状态应该集中到单个 store 对象中. 二.提交 mutation 是更改状态的唯一方法,并且这个过程 ...

  8. webpack你值得拥有-从四个核心配置谈起

    很久没有发文章了,但是强调一点,大-熊同学最近可没闲着.学习算法,复习计算机网络,也顺便学习了一下webpack,看了看操作系统(没办法,都没学,要是不学连实习笔试都过不了,伤心--).本来比较纠结是 ...

  9. Mybatis的mapper代理开发dao方法

    看完了之前的mybatis原始的dao开发方法是不是觉得有点笨重,甚至说没有发挥mybatis 作为一个框架的优势.总结了一下,原始的dao方法有以下几点不足之处 dao接口实现方法中存在大量的模板方 ...

  10. 09_Python定义方法_Python编程之路

    有关Python判断与循环的内容我们上几节已经跟大家一起学习了,这一节我们主要针对def 做一个讲解 def 定义一个方法 在项目编程中,我们往往要做很多重复的事,比如一个排序的功能(当然Python ...