bzoj4278
来源:互联网 发布:apple mac book pro 编辑:程序博客网 时间:2024/06/16 19:19
题意
给定两个数字串A和B,要求归并得到一个字典序最小的数字串T(长度<200000)
分析
(大水题)
搞一波后缀数组,再用两指针扫一遍就好了。
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=1001000;int sa[N],tsa[N],rk[N],trk[N],sum[N];int len1,len2,cnt,m,s[N];int main(){ freopen("a.in","r",stdin); scanf("%d",&len1); for (int i=1;i<=len1;i++) scanf("%d",s+i); scanf("%d",&len2);s[len1+1]=1001; for (int i=len1+2;i<=len1+len2+1;i++) scanf("%d",s+i);s[len1+len2+2]=0; int len=len1+len2+2; for (int i=1;i<=len;i++) sum[s[i]]++; for (int i=1;i<=1001;i++) sum[i]+=sum[i-1]; for (int i=len;i;i--) sa[sum[s[i]]--]=i; rk[sa[1]]=1;cnt=1; for (int i=2;i<=len;i++){ if (s[sa[i]]!=s[sa[i-1]]) cnt++; rk[sa[i]]=cnt; }m=cnt; for (int j=1;m<len;j*=2){ cnt=0; memset(sum,0,sizeof(sum)); memmove(trk,rk,sizeof(rk)); for (int i=len-j+1;i<=len;i++) tsa[++cnt]=i; for (int i=1;i<=len;i++) if (sa[i]>j) tsa[++cnt]=sa[i]-j; for (int i=1;i<=len;i++) sum[ trk[tsa[i]] ]++; for (int i=1;i<=m;i++) sum[i]+=sum[i-1]; for (int i=len;i;i--) sa[sum[ trk[tsa[i]] ]--]=tsa[i]; rk[sa[1]]=1;cnt=1; for (int i=2;i<=len;i++){ if (trk[sa[i]]!=trk[sa[i-1]] || trk[sa[i]+j]!=trk[sa[i-1]+j]) cnt++; rk[sa[i]]=cnt; }m=cnt; } int t1=1,t2=2+len1; for (int i=1;i<=len-2;i++){ if (t1==len1+1) printf("%d ",s[t2]),t2++; else if (t2==len1+len2+2) printf("%d ",s[t1]),t1++; else if (rk[t1]<rk[t2]) printf("%d ",s[t1]),t1++; else printf("%d ",s[t2]),t2++; } printf("\n");}
0 0
- bzoj4278
- [BZOJ4278] [ONTAK2015]Tasowanie
- bzoj4278: [ONTAK2015]Tasowanie
- 【bzoj4278】 [ONTAK2015]Tasowanie 后缀数组
- [BZOJ4278][ONTAK2015]Tasowanie(后缀数组+贪心)
- HBase列族设计优化
- 容器为何物,为什么它对OpenStack很重要?
- CSS3 正方体 旋转木马动画
- CRM代码片段
- Error creating bean with name 'sqlSessionFactory' defined in class path resource [applicationContext
- bzoj4278
- photoshop裁剪图片
- 有利于排名的网页标题和描述创作
- perl 打印复杂数据结构
- 蓝桥杯 网络寻路 暴力法 By Assassin
- The linux command line--part one(二) Learing Shell
- 空指针异常的解决
- Count Primes
- 常见性能优化策略总结