【bzoj4278】[ONTAK2015]Tasowanie 贪心+后缀数组
题目描述
输入
输出
样例输入
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 <cstdio>
- #define N 400005
- int 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;
- }
【bzoj4278】[ONTAK2015]Tasowanie 贪心+后缀数组的更多相关文章
- [BZOJ4278] [ONTAK2015]Tasowanie 贪心+后缀数组
题目链接 最近做题目好像有点东一榔头西一棒.好吧其实订正模拟题的时候需要用到什么感觉不太熟的就写一下吧. 显然直接贪心,比较两个点后面的串的字典序,小就选谁就可以了. 可以把两个串接起来,加一个\(i ...
- 【bzoj1692】[Usaco2007 Dec]队列变换 贪心+后缀数组
题目描述 FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. ...
- [bzoj1692][Usaco2007 Dec]队列变换——贪心+后缀数组
Brief Description 给定一个数列,您每次可以把数列的最前面的数或最后面的数移动到新数列的开头,使得新数列字典序最小.输出这个新序列. Algorithm Design 首先我们可以使用 ...
- POJ3617:Best Cow Line (贪心&&后缀数组)
FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year" competiti ...
- BZOJ4278 [ONTAK2015]Tasowanie[后缀数组+贪心]
题目 求两数组归并后的数组最小字典序排列. 嘛,可能本人在贪心这块还是太弱了(或者说什么都弱),如果不知道是字符串题估计也想不起来用sa. 显然看得出归并时字典序小的那个数组先往里面加,这就是要比较两 ...
- bzoj4278[ONTAK2015]Tasowanie & bzoj1692[USACO 2007Dec]队列变换(Best Cow Line) 贪心正确性证明
做法网上到处都有就不说了. 这题其实是之前做的….不过由于人太傻现在才想明白比较字典序进行贪心的正确性…. 方便起见,在两个串的最右端都加上很大但不相同的字符,避免第lcp+1个字符不存在的边界. 如 ...
- BZOJ4278 : [ONTAK2015]Tasowanie
首先在串的末尾加上1000,然后进行归并,每次取字典序较小的那个后缀即可. 用hash+二分支持查询lcp,时间复杂度$O(n\log n)$. #include<cstdio> type ...
- 1692. [USACO07DEC] 队列变换【后缀数组+贪心】
Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席 ...
- [bzoj4278][ONTAK2015]Tasowanie_后缀数组_贪心
Tasowanie bzoj-4278 ONTAK-2015 题目大意:给定两个字符串,求两个字符串二路归并之后生成的字典序最小的字符串是什么. 注释:$1\le len_1,len_2\le 2\c ...
随机推荐
- Calendar 实现日历实例
import java.text.ParseException; import java.util.Calendar; import java.util.GregorianCalendar; impo ...
- Jmeter 接口自动化执行报错 无法找到类或者类的方法
写好的自动化测试脚本在PC以及mac book 都执行正确,但是放到linux集成环境时就一直报错,报错类似如下 [jmeter] // Debug: eval: nameSpace = NameSp ...
- Linux命令应用大词典-第21章 LVM和RAID管理
21.1 pvcreate:创建物理卷 21.2 pvscan:列出找到的物理卷 21.3 pvdisplay:显示物理卷的相关属性 21.4 vgcreate:创建卷组 21.5 vgscan:查找 ...
- Unity编辑器 - 自动排版
Unity编辑器 - 自动排版 使用花括号提高可读性 //一组横向排列的控件 GUILayout.BeginHorizontal(); { GUILayout.BeginVertical(); { / ...
- (C#)工厂方法模式
1.工厂方法模式 第一了一个用于创建对象的接口,让子类自己决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. *工厂方法模式即克服了简单工厂模式违反开放-封闭原则的缺点,又保留了封装对象创建过 ...
- C# 中访问修饰符
1.public 完全公开的,公共的 2. private 私有的,只能在当前类的内部访问, 不可修饰类 3.protected 受保护的,只能在当前类的内部以及其子类中访问,不能用来修饰类 4.in ...
- Java注解的基本原理
注解的本质就是一个继承了Annotation接口的接口,一个注解准确意义上来说,只不过是一种特殊注释而已,如果没有解析他的代码,他可能连注释都不如. 解析一个类或者方法的注解往往有两种形式,一种是编译 ...
- js for循环实例
1.求1-100的寄数和? //2.奇数求和 var ppt=0 for(var i=1;i<=100;i+=2){ ppt+=i } 2.求1-100的偶数和 var num=0 for(va ...
- javaee开发工具及环境配置过程
在配置javaee开发环境的过程中遇到过很多问题,在此系统的整理一下我之前的配置过程 注:配置过程学习自<JSP&Servlet学习笔记(第二版)>详细过程可以阅读此书.在文章的最 ...
- 剑指offer-栈的压入弹出序列21
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...