博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj4278】[ONTAK2015]Tasowanie 贪心+后缀数组
阅读量:5167 次
发布时间:2019-06-13

本文共 2176 字,大约阅读时间需要 7 分钟。

题目描述

给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T。

输入

第一行包含一个正整数n(1<=n<=200000),表示A串的长度。
第二行包含n个正整数,其中第i个数表示A[i](1<=A[i]<=1000)。
第三行包含一个正整数m(1<=m<=200000),表示B串的长度。
第四行包含m个正整数,其中第i个数表示B[i](1<=B[i]<=1000)。

输出

输出一行,包含n+m个正整数,即字典序最小的T串。

样例输入

6

1 2 3 1 2 4
7
1 2 2 1 3 4 3

样例输出

1 1 2 2 1 2 3 1 2 3 4 3 4


题解

贪心+后缀数组

贪心法则:选择字典序小的串。

那么我们就可以将两个串放到一起,利用后缀数组求排名,减少时间。

需要注意的是两个串之间需要加一个最大数,因为如果第一个串全部用完,rank应该为最大。

#include 
#define N 400005int ws[N] , wv[N] , wa[N] , wb[N] , sa[N] , r[N] , rank[N] , m = 1003 , n , a[N];void da(){ int i , j , p , *x = wa , *y = wb , *t; for(i = 0 ; i < m ; i ++ ) ws[i] = 0; for(i = 0 ; i < n ; i ++ ) ws[x[i] = r[i]] ++ ; for(i = 1 ; i < m ; i ++ ) ws[i] += ws[i - 1]; for(i = n - 1 ; i >= 0 ; i -- ) sa[--ws[x[i]]] = i; for(p = j = 1 ; p < n ; j <<= 1 , m = p) { for(p = 0 , i = n - j ; i < n ; i ++ ) y[p ++ ] = i; for(i = 0 ; i < n ; i ++ ) if(sa[i] - j >= 0) y[p ++ ] = sa[i] - j; for(i = 0 ; i < n ; i ++ ) wv[i] = x[y[i]]; for(i = 0 ; i < m ; i ++ ) ws[i] = 0; for(i = 0 ; i < n ; i ++ ) ws[wv[i]] ++ ; for(i = 1 ; i < m ; i ++ ) ws[i] += ws[i - 1]; for(i = n - 1 ; i >= 0 ; i -- ) sa[--ws[wv[i]]] = y[i]; for(t = x , x = y , y = t , x[sa[0]] = 0 , p = i = 1 ; i < n ; i ++ ) { if(y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + j] == y[sa[i] + j]) x[sa[i]] = p - 1; else x[sa[i]] = p ++ ; } } for(i = 1 ; i < n ; i ++ ) rank[sa[i]] = i;}int main(){ int n1 , n2 , i , p1 , p2; scanf("%d" , &n1); for(i = 0 ; i < n1 ; i ++ ) { scanf("%d" , &a[i]); r[i] = a[i]; } scanf("%d" , &n2); for(i = n1 + 1 ; i < n1 + n2 + 1 ; i ++ ) { scanf("%d" , &a[i]); r[i] = a[i]; } r[n1] = 1001; r[n1 + n2 + 1] = 0; n = n1 + n2 + 2; da(); p1 = 0; p2 = n1 + 1; while(p1 < n1 || p2 < n1 + n2 + 1) { if(p2 < n1 + n2 + 1 && rank[p2] < rank[p1]) printf("%d " , a[p2 ++ ]); else printf("%d " , a[p1 ++ ]); } printf("\n"); return 0;}

转载于:https://www.cnblogs.com/GXZlegend/p/6272282.html

你可能感兴趣的文章
HTML5简单入门系列(四)
查看>>
实现字符串反转
查看>>
转载:《TypeScript 中文入门教程》 5、命名空间和模块
查看>>
苹果开发中常用英语单词
查看>>
[USACO 1.4.3]等差数列
查看>>
Shader Overview
查看>>
Reveal 配置与使用
查看>>
Java中反射的学习与理解(一)
查看>>
C语言初学 俩数相除问题
查看>>
B/S和C/S架构的区别
查看>>
[Java] Java record
查看>>
jQuery - 控制元素显示、隐藏、切换、滑动的方法
查看>>
postgresql学习文档
查看>>
Struts2返回JSON数据的具体应用范例
查看>>
socket阻塞与非阻塞,同步与异步
查看>>
团队工作第二天
查看>>
System类
查看>>
tableView
查看>>
Happy Great BG-卡精度
查看>>
Xamarin Visual Studio不识别JDK路径
查看>>