bzoj 4278 [ONTAK2015]Tasowanie(SA,贪心)
【题意】
给定两个字符串,求二路归并后最小字典序的字符串。
【思路】
连接两个字符串后求出rank数组。通过比较rank数组进行二路归并。
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define FOR(a,b,c) for(int a=b;a<=c;a++)
using namespace std; typedef long long ll;
const int N = 4e3+; ll read()
{
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-;
c=getchar();
}
while(isdigit(c))
x=x*+c-'',
c=getchar();
return x*f;
} int s[N];
int t[N],t2[N],c[N],sa[N],rank[N]; void build_sa(int m,int n)
{
int *x=t,*y=t2;
FOR(i,,m-) c[i]=;
FOR(i,,n-) c[x[i]=s[i]]++;
FOR(i,,m-) c[i]+=c[i-];
for(int i=n-;i>=;i--) sa[--c[x[i]]]=i;
for(int k=;k<=n;k<<=) {
int p=;
FOR(i,n-k,n-) y[p++]=i;
FOR(i,,n-) if(sa[i]>=k) y[p++]=sa[i]-k; FOR(i,,m-) c[i]=;
FOR(i,,n-) c[x[y[i]]]++;
FOR(i,,m-) c[i]+=c[i-];
for(int i=n-;i>=;i--) sa[--c[x[y[i]]]]=y[i]; swap(x,y);
p=; x[sa[]]=;
FOR(i,,n-)
x[sa[i]]=y[sa[i]]==y[sa[i-]]&&y[sa[i]+k]==y[sa[i-]+k]?p-:p++;
if(p>=n) break;
m=p;
}
}
void get_rank(int n)
{
FOR(i,,n-) rank[sa[i]]=i;
} int n,m,len,a[N],b[N],ans[N]; int main()
{
n=read();
FOR(i,,n-) a[i]=read(),s[len++]=a[i];
s[len++]=;
m=read();
FOR(i,,m-) b[i]=read(),s[len++]=b[i];
s[len++]=; build_sa(,len);
get_rank(len); int p1=,p2=,tot=;
while(p1<n || p2<m) {
if(p1>=n) printf("%d ",b[p2++]);
else if(p2>=m) printf("%d ",a[p1++]);
else {
if(rank[p1]<rank[n++p2]) printf("%d ",a[p1++]);
else printf("%d ",b[p2++]);
}
}
return ;
}
bzoj 4278 [ONTAK2015]Tasowanie(SA,贪心)的更多相关文章
- BZOJ 4278: [ONTAK2015]Tasowanie 后缀数组 + 贪心 + 细节
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in", "r", stdin ...
- ●BZOJ 4278 [ONTAK2015]Tasowanie
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4278 题解: 把两个串连接起来,用一个大数连接(必须要用大数).倍增算法求出后缀排名.然后两 ...
- bzoj 4278 [ONTAK2015]Tasowanie——后缀数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4278 因为每次要放后缀较小的那个,所以把两个序列放在一起排序吧.改一改模板. 其实要改的地方 ...
- 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
给出两个字符串 A B 让我们对其二路归并 求出能够归并出的最小字典序. 考虑后缀数组 不难发现我们将B直接连在A上会出现问题 问题是 A串剩下的和B串完全相同了 那么此时比大小就会用到B的部分 这是 ...
- [ONTAK2015]Tasowanie
[ONTAK2015]Tasowanie 题目大意: 给你两个长度分别为\(n(n\le2\times10^5)\)的序列\(A,B\),将\(A,B\)进行二路归并,使得最后得到的序列字典序最小.求 ...
- 【BZOJ4278】[ONTAK2015]Tasowanie 后缀数组
[BZOJ4278][ONTAK2015]Tasowanie Description 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T. Input 第一行包含 ...
- bzoj 4278 Tasowanie 后缀数组+贪心
题目大意 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T.\(len \leq 200000\) 题解 我们从归并排序的角度去想,每次把两者之一较小的取出来 ...
随机推荐
- asp.net如何设置数据库连接池的数量
http://www.cnblogs.com/wbcms/archive/2008/10/11/1308725.html 可以使用一组名称-值对以链接字符串的形式配置链接池.例如,可以配置池是否有效( ...
- java工具类系列 (四.SerializationUtils)
java工具类系列 (四.SerializationUtils) SerializationUtils该类为序列化工具类,也是lang包下的工具,主要用于序列化操作 import java.io.Se ...
- 数据类型演示DataTypeDemo
/***数据类型演示*/public class DataTypeDemo{ public static void main(String[] args){ //直接赋予的值,称为字面量 //by ...
- Android Handler传递参数动态更新UI界面demo
package com.example.demo_test; import android.app.Activity; import android.os.Bundle; import android ...
- JCIFS是很不稳定的
我以前也试过这样登录失败,第二天就能登录成功了. JCIFS是很不稳定的. 如果是域登录可以这样 //DOMAIN_IP 域名服务(其实域名和域名服务器IP可以,不过用IP解析速度快很 ...
- OPENGL画图类库
链接 https://www.opengl.org/wiki/Language_bindings http://blog.csdn.net/luozhuang/article/details/421 ...
- Image.FrameDimensionsList 属性-----具体使用案例2
图片的拆分 1.保存png图片 using System; using System.Collections.Generic;using System.ComponentModel;using Sys ...
- ie下jquery ajax 80020101错误的解决方法
<script language="javascript"> <!-- function checkAll(name,isCheck){ ...
- bzoj3632
裸的最大团,随机化大法好 多次随机出一个选择顺序然后贪心即可 ..,..] of boolean; a:..] of longint; v:..] of boolean; n,m,i,j,x,y,an ...
- Liunx常用的特殊环境变量
[weiqiang.liu@l~]$ sh variable xiaoqiang xiaoxuenumber:2scname:variablefirst:xiaoqiangsecond:xiaoxue ...