题解:

后缀数组求出本质不同的串

然后二分答案

贪心判断是否可行

代码:

#include<bits/stdc++.h>
const int N=;
using namespace std;
typedef long long ll;
char s[N];
ll L,R,mid;
int K,n,rk[N],sa[N],height[N],tmp[N],cnt[N],Log[N];
int f[][N],g[N],len,nowl,nowr,ansl,ansr;
void SA(int n,int m)
{
n++;
for (int i=;i<n;i++)cnt[rk[i]=s[i]]++;
for (int i=;i<m;i++)cnt[i]+=cnt[i-];
for (int i=;i<n;i++)sa[--cnt[rk[i]]]=i;
for (int k=;k<=n;k<<=)
{
for (int i=;i<n;i++)
{
int j=sa[i]-k;
if (j<)j+=n;
tmp[cnt[rk[j]]++]=j;
}
int j=;
sa[tmp[cnt[]=]]=j=;
for (int i=;i<n;i++)
{
if (rk[tmp[i]]!=rk[tmp[i-]]||rk[tmp[i]+k]!=rk[tmp[i-]+k])cnt[++j]=i;
sa[tmp[i]]=j;
}
memcpy(rk,sa,n*sizeof(int));
memcpy(sa,tmp,n*sizeof(int));
if (j>=n-)break;
}
for (int i,k,j=rk[height[i=k=]=];i<n-;i++,k++)
while (~k&&s[i]!=s[sa[j-]+k])height[j]=k--,j=rk[sa[j]+];
}
int lcp(int x,int y)
{
if (x==y)return n-x;
x=rk[x],y=rk[y];
if (x>y)swap(x,y);
int k=Log[y-x];
return min(f[k][x+],f[k][y-(<<k)+]);
}
void kth(ll k)
{
ll s=;
for (int i=;i<=n;s+=n-sa[i]-height[i],i++)
if (s+n-sa[i]-height[i]>=k)
{
nowl=sa[i],nowr=nowl+height[i]+k-s-;
len=nowr-nowl+;
return;
}
}
int ask(int l,int r)
{
int t=min(lcp(l,nowl),min(r-l+,len));
if (t==r-l+&&t<=len)return ;
if (t==len)return ;
return s[l+t]<=s[nowl+t];
}
int check()
{
int j,k=;
for (int i=n-;~i;i=j,k++)
{
for (j=i;~j;j--)
if (!ask(j,i))break;
if (j==i)return ;
}
return k<=K;
}
int main()
{
scanf("%d%s",&K,s);
n=strlen(s);
SA(n,);
for (int i=;i<=n;i++)Log[i]=Log[i>>]+;
for (int i=;i<=n;i++)f[][i]=height[i];
for (int j=;j<;j++)
for (int i=;i+(<<j-)<=n;i++)f[j][i]=min(f[j-][i],f[j-][i+(<<j-)]);
for (int i=;i<=n;i++)R+=n-sa[i]-height[i];
while (L<=R)
{
kth(mid=(L+R)>>);
if (check())ansl=nowl,ansr=nowr,R=mid-;
else L=mid+;
}
for (int i=ansl;i<=ansr;i++)putchar(s[i]);
return ;
}

bzoj4310的更多相关文章

  1. 【BZOJ4310】跳蚤

    [BZOJ4310]跳蚤 Description 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他 ...

  2. BZOJ4310 跳蚤(后缀数组+二分答案)

    注意到答案一定是原串的子串,于是考虑造出SA,二分答案是第几小的子串.第k小子串很容易在SA上求出.之后计算使他成为最大子串至少要在几个位置切割,对每个字典序比答案大的后缀,找到所有合法切割位置(求l ...

  3. [BZOJ4310] 跳蚤 - 后缀数组,二分,ST表

    [BZOJ4310] 跳蚤 Description 首先,他会把串分成不超过 \(k\) 个子串,然后对于每个子串 \(S\) ,他会从 \(S\) 的所有子串中选择字典序最大的那一个,并在选出来的 ...

  4. 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分

    4310: 跳蚤 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 180  Solved: 83[Submit][Status][Discuss] De ...

  5. BZOJ4310 : 跳蚤

    首先求出后缀数组,得到本质不同的子串的个数. 然后二分答案,每次先通过后缀数组求出第$mid$小的子串,然后贪心进行检验. 检验的时候,从后往前贪心,每次加入一个后缀,如果不能加了,那就划为一段. 时 ...

  6. BZOJ4310: 跳蚤 【后缀数组+二分】

    Description 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究.首先,他会把串 分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典 ...

  7. 【bzoj4310/hdu5030-跳蚤】后缀数组

    我真的是..调了一百年.. 傻逼的人生.. 而且这题好像可以用sam做哎!我Y出了一个奇怪的办法.. 好吧sam是不能做这题的.搞错了. 说说后缀数组好了.. 搞后缀数组 然后我们要二分一个子串,判断 ...

  8. 【bzoj4310】跳蚤 后缀数组+二分

    题目描述 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最大的那一个 ...

  9. [BZOJ4310] 跳蚤 SAM || SA

    没有代码的. 传送门 先二分出第 \(mid\) 大的字串 \(s\),然后从后往前切割,每次大于 \(s\) 了就不行. 涉及到的操作:求第 \(mid\) 大子串:比较两个字串(求 \(lcp\) ...

随机推荐

  1. 《剑指offer》第五十题(字符串中第一个只出现一次的字符)

    // 面试题50(一):字符串中第一个只出现一次的字符 // 题目:在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出 // 'b'. #include & ...

  2. 修改记录-优化后(springboot+shiro+session+redis+ngnix共享)

    1.普通用户实现redis共享session 1.配置 #cache指定缓存类型 spring.cache.type=REDIS #data-redis spring.redis.database=1 ...

  3. Qt访问注册表并调用子进程

    在实际应用中需要在一个进程启动另外一个进程,可以将子进程的路径写入注册表中,然后主进程读取注册表中子进程路径,启动子进程,并以命令行参数的形式传入参数,启动子进程.具体实现方式如下 (1)      ...

  4. Python全栈开发-Day8-Socket网络编程

    本节内容 断言 Socket构建框架 ftp构建框架 Socket粘包 Socket介绍 Socket参数介绍 基本Socket实例 通过Socket实现简单SSH SocketServer 支持多用 ...

  5. Linux中apt与apt-get命令的区别与解释

    2019-01-15 14:35:39 随着 apt install package 命令的使用频率和普遍性逐步超过 apt-get install package,越来越多的其它 Linux 发行版 ...

  6. 有效利用1 on 1

    2019-01-08 16:32:13 感觉1 on 1是浪费时间? 感觉1 on 1时没啥好说? 感觉老板总是不想1 on 1? 怎样才能 升职加薪? 一切都从有效的1 on 1开始!! 什么是1 ...

  7. selenium+Page Objects(第三话)

    写好BasePage基类和页面元素定位后,就可以针对每个页面写业务逻辑了 1.编写每个页面page类,拿其中一个页面为例 fourth_page.py(名字我随便取的,实际中希望能取一些有意义的名字) ...

  8. ThinkPHP表单自动验证(注册功能)

    控制器中: 模型中: 视图中:

  9. [Spring] ClassPathXmlApplicationContext类

    1. 该类在package org.springframework.context.support包下. 该包在4.0.1中封装在spring-context-***.jar中. 其无参构造函数的文档 ...

  10. Configuring Groovy SDK within IntelliJ IDEA

    一.原因 IntelliJ IDEA期待一个the standard Groovy SDK    二.解决方案: 下载安装Groovy就可以了   官网下载地址: http://groovy-lang ...