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. 不看就亏了:DELL EqualLogic PS6100详解及数据恢办法

    DELL EqualLogic PS6100采用虚拟ISCSI SAN阵列,为远程或分支办公室.部门和中小企业存储部署带来企业级功能.智能化.自动化和可靠性,支持VMware.Solaris.Linu ...

  2. nyoj 非洲小孩

    非洲小孩 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 家住非洲的小孩,都很黑.为什么呢?第一,他们地处热带,太阳辐射严重.第二,他们不经常洗澡.(常年缺水,怎么洗 ...

  3. JAVA_SE基础——44.抽象类的练习

    抽象类要注意的细节: 1. 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象 的函数..2. 如果一个类出现了抽象的函数,那么该类也必须 使用abstract修饰. ...

  4. JAVA_SE基础——24.面向对象的内存分析

    黑马程序员入学blog ... 接着上一章的代码: //车类 class Car{ //事物的公共属性使用成员变量描述. String name; //名字的属性 String color; //颜色 ...

  5. System V IPC 之消息队列

    消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型 ...

  6. C# 使用 GDI+ 画图

    最近做一个微信公众号服务,有一些简单的图片处理功能.主要就是用户在页面操作,前端做一些立刻显示的效果,然后提交保存时后端真正修改原图. 我们的后端是 ASP.NET,也就是 C# 语言了,C# 本身处 ...

  7. 一张图说明 Web Api 参数绑定默认规则

    请求如下: 控制器如下: 慎重说明:不管请求方式是 get 还是 post , 简单类型的参数,如 name 和 id ,其值都是从 url 里面去取. Web API 从 url 还是 body 获 ...

  8. linux命令行传递参数定期执行PHP文件

    最近在做一个项目,需要在linux下传递参数定期执行PHP文件,网上查询资料,确实有相关资料,现整理如下: 1.linux执行PHP文件 #{PHP安装bin路径} {PHP文件路径} {需要参数1 ...

  9. Hazelcast分布式

    一般的应用正式环境中都不止一台服务器(也就是说是集群的),那么如果只是简单的将数据预加载到内存,那么就会有数据不同步的现象. (更新了其中一台JVM,另一台JVM并不会收到通知从而保持数据同步). 这 ...

  10. 新概念英语(1-55)The Sawyer family

    新概念英语(1-55)The Sawyer family When do the children do their homework? The Sawyers live at 87 King Str ...