bzoj4310
题解:
后缀数组求出本质不同的串
然后二分答案
贪心判断是否可行
代码:
#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的更多相关文章
- 【BZOJ4310】跳蚤
[BZOJ4310]跳蚤 Description 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他 ...
- BZOJ4310 跳蚤(后缀数组+二分答案)
注意到答案一定是原串的子串,于是考虑造出SA,二分答案是第几小的子串.第k小子串很容易在SA上求出.之后计算使他成为最大子串至少要在几个位置切割,对每个字典序比答案大的后缀,找到所有合法切割位置(求l ...
- [BZOJ4310] 跳蚤 - 后缀数组,二分,ST表
[BZOJ4310] 跳蚤 Description 首先,他会把串分成不超过 \(k\) 个子串,然后对于每个子串 \(S\) ,他会从 \(S\) 的所有子串中选择字典序最大的那一个,并在选出来的 ...
- 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分
4310: 跳蚤 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 180 Solved: 83[Submit][Status][Discuss] De ...
- BZOJ4310 : 跳蚤
首先求出后缀数组,得到本质不同的子串的个数. 然后二分答案,每次先通过后缀数组求出第$mid$小的子串,然后贪心进行检验. 检验的时候,从后往前贪心,每次加入一个后缀,如果不能加了,那就划为一段. 时 ...
- BZOJ4310: 跳蚤 【后缀数组+二分】
Description 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究.首先,他会把串 分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典 ...
- 【bzoj4310/hdu5030-跳蚤】后缀数组
我真的是..调了一百年.. 傻逼的人生.. 而且这题好像可以用sam做哎!我Y出了一个奇怪的办法.. 好吧sam是不能做这题的.搞错了. 说说后缀数组好了.. 搞后缀数组 然后我们要二分一个子串,判断 ...
- 【bzoj4310】跳蚤 后缀数组+二分
题目描述 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最大的那一个 ...
- [BZOJ4310] 跳蚤 SAM || SA
没有代码的. 传送门 先二分出第 \(mid\) 大的字串 \(s\),然后从后往前切割,每次大于 \(s\) 了就不行. 涉及到的操作:求第 \(mid\) 大子串:比较两个字串(求 \(lcp\) ...
随机推荐
- python3+虹软2.0 离线人脸识别 demo
python3+虹软2.0的所有功能整合测试完成,并对虹软所有功能进行了封装,现提供demo主要功能,1.人脸识别2.人脸特征提取3.特征比对4.特征数据存储与比对其他特征没有添加 虹软SDK下载戳这 ...
- Codeforces Gym - 101102B - The Little Match Girl
B. The Little Match Girl time limit per test 1 second memory limit per test 256 megabytes input stan ...
- PHP数组合并和去重的函数有哪些
PHP数组合并和去重的函数有哪些 一.总结 一句话总结:合并:array_merge() array_merge_recursive() +号:去重:array_flip() array_unique ...
- C# 遍历文件夹筛选目标文件
有近400G的数据,首先需要写程序把目标文件标准化名称(相当耗时,各种情形,间接说明在数据采集过程中标准化操作的重要性,这样会给后续处理带来很多不必要的麻烦和消耗) 网上找了个方法还不错,还有一种递归 ...
- Java方法重载的区分
测试程序代码: class Computer { private int x; public Computer(){ this(10); } /** * 构造方法重载 * @param x */ pu ...
- linux中ping IP可以通但是主机名不通
在/etc/hosts中配置要ping的主机名称映射 例如: ping test1不通 在/etc/hosts中配置 ip地址 test1
- hdu-6035 Colorful Tree
题目意思是计算所有路径(n*(n-1)/2)经过的不同颜色的数目和. 这个数目和可以转化为每种颜色经过的路径数目的求和,而这个求和又等价于颜色总数*n*(n-1)/2-没有经过某种颜色的边的数量的求和 ...
- 自定义Exception异常
自定义异常构建 首先写一个自定义异常,继承Exception,代码如下 public class NoMappingParamString extends Exception { /*无参构造函数*/ ...
- CSS之透视perspective属性
透视原理: 近大远小 . 浏览器透视:把近大远小的所有图像,透视在屏幕上. 书写方式不同的定义 perspective有两种定义方式,如下 .class{ perspective: 800px; } ...
- get post 小结
get参数通过url传递,post放在request body中. get请求在url中传递的参数是有长度限制的,而post没有. get比post更不安全,因为参数直接暴露在url中,所以不能用来传 ...