题目链接

最近做题目好像有点东一榔头西一棒。好吧其实订正模拟题的时候需要用到什么感觉不太熟的就写一下吧。

显然直接贪心,比较两个点后面的串的字典序,小就选谁就可以了。

可以把两个串接起来,加一个\(inf\)分隔。然后用\(SA\)的\(rank\)数组就可以比较大小了。

也可以用哈希+二分比较。

#include<bits/stdc++.h>
using namespace std;
#define fec(i,x,y) (int i=head[x],y=g[i].to;i;i=g[i].ne,y=g[i].to)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
#define isin(x,S) (((S)>>((x)-1))&1)
#define fi first
#define se second
#define pb push_back
template<typename I>inline void read(I&x){int f=0,c;while(!isdigit(c=getchar()))c=='-'?f=1:0;x=c&15;while(isdigit(c=getchar()))x=(x<<1)+(x<<3)+(c&15);f?x=-x:0;}
template<typename A,typename B>inline char SMAX(A&a,const B&b){return a<b?a=b,1:0;}
template<typename A,typename B>inline char SMIN(A&a,const B&b){return a>b?a=b,1:0;}
typedef long long ll;typedef unsigned long long ull;typedef pair<int,int>pii; const int N=400000+7;
int n,m,a[N],b[N],ans[N]; int sa[N],rk[N],sec[N],tax[N];
inline void MakeSA(){
int n=::n+::m+1,m=1001,*rnk=rk,*sc=sec;
for(int i=1;i<=m;++i)tax[i]=0;
for(int i=1;i<=n;++i)tax[rnk[i]=a[i]]++;
for(int i=1;i<=m;++i)tax[i]+=tax[i-1];
for(int i=n;i;--i)sa[tax[rnk[i]]--]=i;
for(int k=1;k<=n;k<<=1){
int p=0;
for(int i=n-k+1;i<=n;++i)sc[++p]=i;
for(int i=1;i<=n;++i)if(sa[i]>k)sc[++p]=sa[i]-k;
for(int i=1;i<=m;++i)tax[i]=0;
for(int i=1;i<=n;++i)tax[rnk[sc[i]]]++;
for(int i=1;i<=m;++i)tax[i]+=tax[i-1];
for(int i=n;i;--i)sa[tax[rnk[sc[i]]]--]=sc[i];
swap(rnk,sc);p=rnk[sa[1]]=1;
for(int i=2;i<=n;++i)rnk[sa[i]]=(sc[sa[i]]==sc[sa[i-1]]&&sc[sa[i]+k]==sc[sa[i-1]+k]?p:++p);
if(p>=n)break;else m=p;
}
for(int i=1;i<=n;++i)rk[sa[i]]=i;
} int main(){
#ifdef hzhkk
freopen("hkk.in","r",stdin);
#endif
read(n);for(int i=1;i<=n;++i)read(a[i]);
a[n+1]=1001;
read(m);for(int i=1;i<=m;++i)read(b[i]),a[i+n+1]=b[i];
MakeSA();
for(int i=1,j=1,k=1;i<=n||j<=m;++k){
if(j>m||(i<=n&&rk[i]<rk[j+n+1]))ans[k]=a[i++];
else ans[k]=b[j++];
}
for(int i=1;i<=n+m;++i)printf("%d%c",ans[i]," \n"[i==n+m]);
}

最新文章

  1. 读书笔记 --TCP :传输控制协议(二)
  2. CF 321B Kefa and Company(贪心)
  3. SecureCrt设置字符编码
  4. Unity3D 游戏计时功能实现
  5. ZOJ 3827 Information Entropy 水题
  6. poj3177--Redundant Paths(边的双连通)
  7. yml文件数据的简洁表达方法(Hashes to OpenStruct)
  8. php日期处理
  9. 使用Maven在Eclipse中创建Web项目[转]
  10. Java集合源码分析(三)Vevtor和Stack
  11. Spring Boot - Font Awesome OTS parsing error: Failed to convert 字体加载失败
  12. 关于git的常用命令
  13. eclispe file查找
  14. for循环将字典添加到列表中出现覆盖前面数据的问题
  15. mysql表结构的查询与修改
  16. Python小白学习之路(四)——第一次练习题
  17. MapReduce实例&amp;YARN框架
  18. Git log diff config高级进阶
  19. Cocoapods报错Unable to satisfy the following requirements
  20. Code Forces 21 A(模拟)

热门文章

  1. C#第一个程序Helloworld
  2. java中 运算符
  3. LDD3 第15章 内存映射和DMA
  4. thinkphp 级联菜单实现
  5. python+selenium 滑动滚动条的操作
  6. 007-TreeMap、Map和Bean互转、BeanUtils.copyProperties(A,B)拷贝、URL编码解码、字符串补齐,随机字母数字串
  7. Myeclipse优化配置
  8. 快速理解 session/token/cookie 认证方式
  9. Bootstrap 学习笔记4 巨幕页头略缩图警告框
  10. yum安装时出现No more mirrors to try.