【BZOJ4278】[ONTAK2015]Tasowanie
Description
给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T。
Input
第一行包含一个正整数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)。
Output
输出一行,包含n+m个正整数,即字典序最小的T串。
Sample Input
6 1 2 3 1 2 4 7 1 2 2 1 3 4 3
Sample Output
1 1 2 2 1 2 3 1 2 3 4 3 4
题解:后缀数组无脑码,将两个串连成一个,中间用极大值隔开,然后跑后缀数组,每次取两个串开头的比较排名就可以了。
#include#include #include using namespace std;const int maxn=400010;int N,M,n,m,maxx;int r[maxn],ra[maxn],rb[maxn],sa[maxn],st[maxn],rank[maxn];void work(){ int i,j,p,*x=ra,*y=rb; for(i=0;i =0;i--) sa[--st[x[i]]]=i; for(j=p=1;p <<=1,m=p) { for(i=n-j,p=0;i =j) y[p++]=sa[i]-j; for(i=0;i =0;i--) sa[--st[x[y[i]]]]=y[i]; for(swap(x,y),i=p=1,x[sa[0]]=0;i rank[b]&&b