BZOJ 4278 [ONTAK2015]Tasowanie (后缀数组)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4278
题解:
居然把后缀数组写成n^2的。。我真厉害。。
想了无数种方法,最后发现就是比后缀字典序排名,后缀数组即可
注意每个字符串的结尾处要加上一个\(\inf\), 因为相当于要把空位尽量后移使得非空位集中在前面
代码
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 4e5+2;
const int S = 1e3+1;
int sa[N+3];
int rk[N+3];
int tmp[N+3];
int buc[N+3];
int a[N+3];
int ans[N+3];
int n,m;
void getSA()
{
int *x = rk,*y = tmp;
for(int i=0; i<=S; i++) buc[i] = 0;
for(int i=1; i<=n; i++) buc[x[i]=a[i]]++;
for(int i=1; i<=S; i++) buc[i] += buc[i-1];
for(int i=n; i>=1; i--) sa[buc[x[i]]--] = i;
int p = 0,s = S;
for(int j=1; p<n; j<<=1)
{
p = 0;
for(int i=n-j+1; i<=n; i++) {y[++p] = i;}
for(int i=1; i<=n; i++) {if(sa[i]>j) y[++p] = sa[i]-j;}
for(int i=1; i<=s; i++) buc[i] = 0;
for(int i=1; i<=n; i++) buc[x[y[i]]]++;
for(int i=1; i<=s; i++) buc[i] += buc[i-1];
for(int i=n; i>=1; i--) sa[buc[x[y[i]]]--] = y[i];
swap(x,y); p = 1; x[sa[1]] = 1;
for(int i=2; i<=n; i++) x[sa[i]] = (y[sa[i]]==y[sa[i-1]] && y[sa[i]+j]==y[sa[i-1]+j]) ? p : ++p;
s = p;
}
for(int i=1; i<=n; i++) rk[sa[i]] = i;
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++) scanf("%d",&a[i]); a[n+1] = S; n++;
scanf("%d",&m);
for(int i=n+1; i<=n+m; i++) scanf("%d",&a[i]); a[n+m+1] = S; m++;
n += m;
getSA();
int i = 1,j = n-m+1,k = 1;
while(i<n-m && j<n)
{
if(rk[i]<rk[j]) {ans[k] = a[i]; k++; i++;}
else {ans[k] = a[j]; k++; j++;}
}
while(i<n-m) {ans[k] = a[i]; k++; i++;}
while(j<n) {ans[k] = a[j]; k++; j++;}
for(int i=1; i<n-1; i++) printf("%d ",ans[i]);
return 0;
}
BZOJ 4278 [ONTAK2015]Tasowanie (后缀数组)的更多相关文章
- BZOJ 4278: [ONTAK2015]Tasowanie 后缀数组 + 贪心 + 细节
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in", "r", stdin ...
- 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 因为每次要放后缀较小的那个,所以把两个序列放在一起排序吧.改一改模板. 其实要改的地方 ...
- 【BZOJ4278】[ONTAK2015]Tasowanie 后缀数组
[BZOJ4278][ONTAK2015]Tasowanie Description 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T. Input 第一行包含 ...
- bzoj 4278 [ONTAK2015]Tasowanie
给出两个字符串 A B 让我们对其二路归并 求出能够归并出的最小字典序. 考虑后缀数组 不难发现我们将B直接连在A上会出现问题 问题是 A串剩下的和B串完全相同了 那么此时比大小就会用到B的部分 这是 ...
- ●BZOJ 4278 [ONTAK2015]Tasowanie
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4278 题解: 把两个串连接起来,用一个大数连接(必须要用大数).倍增算法求出后缀排名.然后两 ...
- BZOJ4278 [ONTAK2015]Tasowanie[后缀数组+贪心]
题目 求两数组归并后的数组最小字典序排列. 嘛,可能本人在贪心这块还是太弱了(或者说什么都弱),如果不知道是字符串题估计也想不起来用sa. 显然看得出归并时字典序小的那个数组先往里面加,这就是要比较两 ...
- bzoj 4278 [ONTAK2015]Tasowanie(SA,贪心)
[题意] 给定两个字符串,求二路归并后最小字典序的字符串. [思路] 连接两个字符串后求出rank数组.通过比较rank数组进行二路归并. [代码] #include<cstdio> #i ...
- 【BZOJ-4278】Tasowanie 后缀数组 + 归并
4278: [ONTAK2015]Tasowanie Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 164 Solved: 80[Submit][S ...
随机推荐
- audio_device模块分析
1. 对外接口 AudioDeviceModule, 採音放音接口,音量控制,静音控制等 2. 主要类 AudioDeviceModuleImpl, 对外提供的主要实现 ...
- lightbox2
http://lokeshdhakar.com/projects/lightbox2/ 简单的demo <html> <head id="head"> &l ...
- jsp中的setHeader页面跳转备忘录
1 <!-- response.setHeader("refresh","3;url=你想跳的页面")--> <%-- response.se ...
- P2085最小函数值(优先队列)
P2085 最小函数值(minval) 题目描述 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有 ...
- robotframework - 运行报错提示 No keyword with name 'Open Browser' found.
用下面的例子为例: 1.输入以上robot脚本提示: 2.经查阅资料,大部分都使用的是selenium2 版本,无法解该的问题,目前小编使用的是selenium3,不知道selenium是哪个版本的话 ...
- AcWing算法基础1.1
排序 快速排序(快排) 写题的时候用的不多基本都是直接sort ( ),面试可能要手撸快排,上模板 void quick_sort(int q[], int l, int r) { if(l > ...
- Java中多个线程交替循环执行
有些时候面试官经常会问,两个线程怎么交替执行呀,如果是三个线程,又怎么交替执行呀,这种问题一般人还真不一定能回答上来.多线程这块如果理解的不好,学起来是很吃力的,更别说面试了.下面我们就来剖析一下怎么 ...
- linux 如何查看进程的执行时间
ps -ef|grep wo.php 得到 程序的pid 如 123 ps -p 123 -o etime
- Spring Web MVC核心架构
可以查看DispatherServlet中的源代码,就是doDispatch()方法!
- Servlet到Servlet的请求转发与重定向的区别
Servlet跳转到另一个Servlet中: request.getRequestDispatcher().forward();代表默认的是post方法,即在被跳转的Servlet的doPost()方 ...