题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4278

因为每次要放后缀较小的那个,所以把两个序列放在一起排序吧。改一改模板。

其实要改的地方就是让后面序列那部分不要在倍增的时候更新前面序列那部分。

考虑 4 和 43 ,应该是 43 比 4 小;因为放了单独的 4 的话就只能放 43 ,而放了 43 的 4 的话可以放 3 再放单独的 4 。

  即,前缀相等的话短的比较大、长的比较小。把 n-k+1 ~ n 的那个赋值放在 if( sa[i] > k ) 的赋值后面就行了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=4e5+5;
int n,m,tn,a[N],sa[N],tp[N],rk[N],tx[N];
int rdn()
{int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret;
}
void Rsort(int nm)
{for(int i=1;i<=nm;i++)tx[i]=0;for(int i=1;i<=tn;i++)tx[rk[i]]++;for(int i=2;i<=nm;i++)tx[i]+=tx[i-1];for(int i=tn;i;i--)sa[tx[rk[tp[i]]]--]=tp[i];
}
void work()
{int nm=1000;for(int i=1;i<=tn;i++)tp[i]=i,rk[i]=a[i];Rsort(nm);for(int k=1;k<=tn;k<<=1){int tot=0;for(int i=1,j=n+k;i<=tn;i++)if((sa[i]<=n&&sa[i]>k)||(sa[i]>j))tp[++tot]=sa[i]-k;for(int i=max(1,n-k+1);i<=n;i++)tp[++tot]=i;//max//here after ...for(int i=max(n+1,tn-k+1);i<=tn;i++)tp[++tot]=i;Rsort(nm);swap(rk,tp);nm=1;rk[sa[1]]=1;for(int i=2,u,v;i<=tn;i++){u=sa[i]+k;v=sa[i-1]+k;if((sa[i]<=n&&u>n)||(sa[i]>n&&u>tn))u=0;if((sa[i-1]<=n&&v>n)||(sa[i-1]>n&&v>tn))v=0;rk[sa[i]]=(tp[sa[i]]==tp[sa[i-1]]&&tp[u]==tp[v])?nm:++nm;//rk[sa[i]]
    }if(nm==tn)break;}
}
int main()
{n=rdn();for(int i=1;i<=n;i++)a[i]=rdn();m=rdn();tn=n+m;for(int i=n+1;i<=tn;i++)a[i]=rdn();work();int p0=1,p1=n+1;for(int i=1;i<=tn;i++){if(rk[p0]<rk[p1])printf("%d ",a[p0]),p0++;else printf("%d ",a[p1]),p1++;if(p0>n||p1>tn)break;}if(p0<=n)for(;p0<=n;p0++)printf("%d ",a[p0]);if(p1<=tn)for(;p1<=tn;p1++)printf("%d ",a[p1]);puts("");return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10075775.html

bzoj 4278 [ONTAK2015]Tasowanie——后缀数组相关推荐

  1. BZOJ 4278: [ONTAK2015]Tasowanie 后缀数组

    4278: [ONTAK2015]Tasowanie Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 426  Solved: 199 [Submit ...

  2. BZOJ 4278 [ONTAK2015]Tasowanie (后缀数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4278 题解: 居然把后缀数组写成n^2的..我真厉害.. 想了无数种方法,最后发现就是 ...

  3. BZOJ 4278: [ONTAK2015]Tasowanie 后缀数组 + 贪心 + 细节

    Description 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T. Input 第一行包含一个正整数n(1<=n<=200000),表示A串 ...

  4. bzoj 4278 Tasowanie 后缀数组+贪心

    题目大意 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T.\(len \leq 200000\) 题解 我们从归并排序的角度去想,每次把两者之一较小的取出来 ...

  5. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 2326  Solved: 1054 [Submit][Stat ...

  6. bzoj 2865 字符串识别——后缀数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2865 做出 ht[ ] 之后,sa[ ] 上每个位置和它前面与后面取 LCP ,其中较大的长 ...

  7. [BZOJ 3238] [AHOI 2013] 差异 【后缀数组 + 单调栈】

    题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么 ...

  8. UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组、ST表)

    UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组.ST表) 连NOI Day1T1都不会做...看了题解都写不出来还要抄Claris的代码.. 题 ...

  9. 【BZOJ】1031: [JSOI2007]字符加密Cipher(后缀数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1031 很容易想到这就是将字符串复制到自己末尾然后后缀数组搞出sa然后按区间输出即可. 然后换了下模板 ...

最新文章

  1. Rust 2020 调查报告出炉,95%的开发者吐槽Rust难学
  2. vb串口 任意波特率_C#与单片机串口通讯,实现简单的计数功能
  3. ASP.NET 连接MySql数据库
  4. ADF:弹出窗口,对话框和输入组件
  5. Python写简单的TCP服务器
  6. HALCON学习之旅(三)
  7. 最好用的Unity代码编辑器Rider如何免费申请?
  8. 【图论】昂贵的聘礼(最短路变形)
  9. 统计思维:程序员数学之概率统计(第2版)PDF
  10. 【java】输入输出流
  11. java pdf 加水印
  12. 波段高低点指标公式 k线高低点 大盘主图公式
  13. 互联网晚报 | 9月9日 星期四 | 8个电竞项目入选杭州亚运会;联想TruScale正式发布;国民养老保险公司获批筹建...
  14. android 查看UID
  15. 前置:API:DSP:核心交换机:边界网关协议:边界:(防御)防火墙:负载均衡:摆渡机:名词解释
  16. uniapp 清除文件缓存
  17. Mac:scroll reverser触控板和鼠标反转独立设置【free】
  18. Chapter 5. Monte Carlo Methods
  19. Vue2.x动态组件的使用实现组件整合大屏展示
  20. (2) Hive安装

热门文章

  1. 高通平台smd分析及smem共享内存的创建笔记
  2. 08. 函数和流程控制
  3. Zmodem transfer canceled by remote side
  4. 十分钟搞懂什么是CGI
  5. Qt 学习之路 2(80):定位器
  6. Android中GridView使用总结
  7. (码友推荐)2018-07-12 .NET及相关开发资讯速递
  8. 浅析call和apply的不同
  9. ArcSDE初学者需要弄清楚的几个问题(转载)
  10. 【剑指offer】找出数组中出现一次的两个数