bzoj 4278: [ONTAK2015]Tasowanie (后缀数组)
2016-05-12 16:49
363 查看
4278: [ONTAK2015]Tasowanie
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 161 Solved: 77
[Submit][Status][Discuss]
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
61 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 4HINT
Source
By Claris[Submit][Status][Discuss]
题解:将两个串连在一起,然后求后缀数组就可以了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define N 500003 using namespace std; int n,m,len,p,q,k; int sa[2] ,rank[2] ,v ,a ,b ; void solve(int sa ,int rank ,int sa1 ,int rank1 ) { for (int i=1;i<=len;i++) v[rank[sa[i]]]=i; for (int i=len;i>=1;i--) if (sa[i]-k>0) sa1[v[rank[sa[i]-k]]--]=sa[i]-k; for (int i=len-k+1;i<=len;i++) sa1[v[rank[i]]--]=i; for (int i=1;i<=len;i++) rank1[sa1[i]]=rank1[sa1[i-1]]+(rank[sa1[i]]!=rank[sa1[i-1]]||rank[sa1[i]+k]!=rank[sa1[i-1]+k]); } void work() { p=0; q=1; for (int i=1;i<=len;i++) v[a[i]]++; for (int i=1;i<=1001;i++) v[i]+=v[i-1]; for (int i=1;i<=len;i++) sa[p][v[a[i]]--]=i; for (int i=1;i<=len;i++) rank[p][sa[p][i]]=rank[p][sa[p][i-1]]+(a[sa[p][i]]!=a[sa[p][i-1]]); k=1; while (k<len){ solve(sa[p],rank[p],sa[q],rank[q]); p^=1; q^=1; k<<=1; } } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); a[n+1]=1001; scanf("%d",&m); for (int i=1;i<=m;i++) scanf("%d",&a[n+1+i]); len=n+m+1; work(); int head=1; int head1=n+2; int i=1; while (i<=n+m&&head<=n&&head1<=n+m+1) { i++; if (rank[p][head]<rank[p][head1]) printf("%d ",a[head]),head++; else printf("%d ",a[head1]),head1++; } for (int i=head;i<=n;i++) printf("%d ",a[i]); for (int i=head1;i<=n+m+1;i++) printf("%d ",a[i]); printf("\n"); }
相关文章推荐
- win7 telnet用法
- 如果有navigation bar, 在navigation bar 添加一个view来设置颜色
- 转化为16进制
- Linux线程详解
- DLL的灾难 --- DEBUG与RELEASE版本不能交叉调用
- 深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)
- 博客园用户体验
- asp.net MVC5 学习笔记(一)
- Memcached实现机制
- Python2.7注意点汇总(高级特性模块)
- factorial using c
- iOS蓝牙开发(上)基础以及连接外设的实现
- asm.jar 安卓手机屏幕在电脑上显示
- 浅谈iOS开发mvvm模式
- Problem3-1005
- SQLite的使用
- 编译 unity3d 的示例代码过程
- phantomjs使用说明
- Linux堆内存管理深入分析(上)
- 【AD/DA】的一些基础知识