BZOJ4278 [ONTAK2015]Tasowanie[后缀数组+贪心]
求两数组归并后的数组最小字典序排列。
嘛,可能本人在贪心这块还是太弱了(或者说什么都弱),如果不知道是字符串题估计也想不起来用sa。
显然看得出归并时字典序小的那个数组先往里面加,这就是要比较两数组后缀的rank,方法就把两串相拼做后缀排序后比较。
这里附下贪心正确性证明,反正我不太会,只是感性认识一下。
Upd:突然想起来这题其实可以hash+二分比较,码量稍小,不想写了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
template<typename T>inline char MIN(T&A,T B){return A<B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A>B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=(x<<)+(x<<)+(c^),c=getchar();return f?x=-x:x;
}
const int N=+;
int A[N<<],a[N],b[N],l,m,n; int rk[N<<],sa[N<<],cnt[N<<],y[N<<],t=,p;
inline void suffix_sort(){
for(register int i=;i<=l;++i)++cnt[rk[i]=A[i]];
for(register int i=;i<=t;++i)cnt[i]+=cnt[i-];
for(register int i=l;i;--i)sa[cnt[A[i]]--]=i;
for(register int k=;k<l;k<<=,p=){
for(register int i=l-k+;i<=l;++i)y[++p]=i;
for(register int i=;i<=l;++i)if(sa[i]>k)y[++p]=sa[i]-k;
for(register int i=;i<=t;++i)cnt[i]=;
for(register int i=;i<=l;++i)++cnt[rk[y[i]]];
for(register int i=;i<=t;++i)cnt[i]+=cnt[i-];
for(register int i=l;i;--i)sa[cnt[rk[y[i]]]--]=y[i];
swap(rk,y);rk[sa[]]=p=;
for(register int i=;i<=l;++i)rk[sa[i]]=y[sa[i]]==y[sa[i-]]&&y[sa[i-]+k]==y[sa[i]+k]?p:++p;
if(p==l)break;t=p;
}//for(register int i=1;i<=l;++i)printf("%d %d\n",i,rk[i]);
}
//
int main(){//freopen("tmp.in","r",stdin);freopen("tmp.out","w",stdout);
read(n);for(register int i=;i<=n;++i)A[i]=read(a[i]);A[n+]=;
read(m);for(register int i=;i<=m;++i)A[n+i+]=read(b[i]);A[n+m+]=;
l=n+m+;suffix_sort();int i=,j=;
while(i<=n||j<=m){
if(rk[i]<rk[n+j+])printf("%d ",a[i++]);
else printf("%d ",b[j++]);
}puts("");
return ;
}
BZOJ4278 [ONTAK2015]Tasowanie[后缀数组+贪心]的更多相关文章
- BZOJ 4278: [ONTAK2015]Tasowanie 后缀数组 + 贪心 + 细节
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in", "r", stdin ...
- [bzoj4278][ONTAK2015]Tasowanie_后缀数组_贪心
Tasowanie bzoj-4278 ONTAK-2015 题目大意:给定两个字符串,求两个字符串二路归并之后生成的字典序最小的字符串是什么. 注释:$1\le len_1,len_2\le 2\c ...
- 【BZOJ4278】[ONTAK2015]Tasowanie 后缀数组
[BZOJ4278][ONTAK2015]Tasowanie Description 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T. Input 第一行包含 ...
- 【BZOJ-4278】Tasowanie 后缀数组 + 归并
4278: [ONTAK2015]Tasowanie Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 164 Solved: 80[Submit][S ...
- bzoj 4278 Tasowanie 后缀数组+贪心
题目大意 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T.\(len \leq 200000\) 题解 我们从归并排序的角度去想,每次把两者之一较小的取出来 ...
- BZOJ 4278 [ONTAK2015]Tasowanie (后缀数组)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4278 题解: 居然把后缀数组写成n^2的..我真厉害.. 想了无数种方法,最后发现就是 ...
- BZOJ 4278: [ONTAK2015]Tasowanie (后缀数组 / 二分+hash)
直接归并,然后如果哪边的后缀字典序比较小就去哪边,然后就可以后缀数组 博客传送门- 但是本蒟蒻不会后缀数组 Upd:Upd:Upd:现在会了233.一道差不多的题:BZOJ 1692: [Usaco2 ...
- bzoj 4278 [ONTAK2015]Tasowanie——后缀数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4278 因为每次要放后缀较小的那个,所以把两个序列放在一起排序吧.改一改模板. 其实要改的地方 ...
- BZOJ_4278_[ONTAK2015]Tasowanie_后缀数组
BZOJ_4278_[ONTAK2015]Tasowanie_后缀数组 Description 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T. Input ...
随机推荐
- Django之通过tag推荐文章
#路由 views.py def post_detail(request,year,month,day,post): ''' 文章详情 + 评论详情 :param request: :param ye ...
- 浅谈java反序列化工具ysoserial
前言 关于java反序列化漏洞的原理分析,基本都是在分析使用Apache Commons Collections这个库,造成的反序列化问题.然而,在下载老外的ysoserial工具并仔细看看后,我发现 ...
- MySQL5.7.18 备份、Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份,数据导入导出
粗略介绍冷备,热备,温暖,及Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份 --备份的目的 灾难恢复:意外情况下(如服务器宕机.磁盘损坏等)对损 ...
- cacti 主机/网络设备流量监控 图解
1.在配置中找到设备 console —> Device 2.初次添加 cacti 监控主机的时候是没有任何设备的,所以要选择add 添加你要监控的主机 \
- c# 枚举返回字符串操作
//内部类public static class EnumHelper { public static string GetDescription(Enum value) { if (value == ...
- EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之_关于接口调用常见的一些问题(401 Unauthorized)
在之前的博客<EasyNVR H5流媒体服务器方案架构设计之视频能力平台>中我们描述了EasyNVR的定位,作为一个能力平台来进行功能的输出: 也就是说,在通常情况下,我们将一套视频的应用 ...
- Angular入门(四) Router 替换当前页面
1.在 xx.html 中直接 写标签 <a [routerLink]="['/home']">home</a> 2.在 xx.html 中 ...
- 解决集群搭建找不到datanode的问题
解决"no datanode to stop"问题当我停止Hadoop时发现如下信息: no datanode to stop原因:每次namenode format会重新创 ...
- ES通过API调整设置
1.查询es的设置信息 2.查询单个索引的设置 3.设置复制集为0
- 九度OJ 1032:ZOJ (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4569 解决:2561 题目描述: 读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当某个字符用完时,剩下的 ...