Tasowanie bzoj-4278 ONTAK-2015 题目大意:给定两个字符串,求两个字符串二路归并之后生成的字典序最小的字符串是什么. 注释:$1\le len_1,len_2\le 2\cdot 10^5$. 想法: 和队列变换比较像啊. 我们将两个串接在一起然后建立后缀数组即可. 紧接着像那道题一样,在$sa$上弄两个指针贪心地移动即可. Code: #include <iostream> #include <cstdio> #include <cstring&…
BZOJ_4278_[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&l…
队列变换 bzoj-1692 Usaco-2007 Dec 题目大意:给定一个长度为$n$的字符串.每次从头或尾取出一个字符加到另一个字符串里.要求变换后生成的字符串字典序最小,求字典序最小的字符串. 注释:$1\le n\le 3\cdot 10^4$. 想法: 考虑暴力怎么做: 每次把当前字符串左右较小的取出来.如果一样就对着往中间枚举,直到不一样为止. 这样时间复杂度为$O(n^2)$,全是一样的字符即可卡掉. 显然上述过程我们就是比较正反两个字符串谁的字典序更小对吧. 那么我们把原串翻转…
题目 求两数组归并后的数组最小字典序排列. 嘛,可能本人在贪心这块还是太弱了(或者说什么都弱),如果不知道是字符串题估计也想不起来用sa. 显然看得出归并时字典序小的那个数组先往里面加,这就是要比较两数组后缀的rank,方法就把两串相拼做后缀排序后比较. 这里附下贪心正确性证明,反正我不太会,只是感性认识一下. Upd:突然想起来这题其实可以hash+二分比较,码量稍小,不想写了 #include<bits/stdc++.h> using namespace std; typedef long…
[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[…
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in", "r", stdin) #define maxn 4000000 using namespace std; int n, m, tot; int arr[maxn], height[maxn], A[maxn]; namespace SA { int rk[maxn], tp[maxn], sa[maxn], tax[maxn]…
4278: [ONTAK2015]Tasowanie Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 164  Solved: 80[Submit][Status][Discuss] Description 给定两个数字串A和B,通过将A和B进行二路归并得到一个新的数字串T,请找到字典序最小的T. Input 第一行包含一个正整数n(1<=n<=200000),表示A串的长度. 第二行包含n个正整数,其中第i个数表示A[i](1<=A[i]…
差异 bzoj-3238 Ahoi-2013 题目大意:求任意两个后缀之间的$LCP$的和. 注释:$1\le length \le 5\cdot 10^5$. 想法: 两个后缀之间的$LCP$和显然不好求. 我们先构建后缀数组. 那么任意两个后缀之间的$LCP$之和就是所有$sa$数组上所有区间的$ht$最小值. 换言之,我们有一个$a$数组. 显然让你求所有区间的权值和. 一个区间的权值为这个区间内所有$a_i$的最小值. 这个过程我们可以用单调栈实现. Code: #include <io…
Sandy的卡片 bzoj-4698 Sdoi-2008 题目大意:题目链接. 注释:略. 想法: 这个题跟一个Usaco的题特别像.我们把这些串差分 现在我们要求的就是公共子串且出现次数不少于$k$的最长长度. 紧接着把这$n$新串拼一起建立后缀数组. 两种做法: 第一种是二分.我们直接二分答案然后暴力扫验证,复杂度为$O(nlogn)$. 第二种就是双指针保证当前指针中间是满足条件的最短区间,顺便用单调队列求区间$ht$最小值即可. Code: #include <iostream> #i…
公共串 bzoj-2946 Poi-2000 题目大意:给定$n$个字符串,求他们的最长公共子串. 注释:$1\le n\le 5$,$1\le minlen<maxlen\le 2000$. 想法: 常规套路. 我们把这$n$个串拼一起,中间加上$n-1$个不同的非字符集数组隔开. 紧接着我们二分答案. 然后扫$ht$数组,看一下是否存在连续的大于$mid$的一段满足包含了所有串. $ht$除了有一个值之外还存了一下这个后缀是哪个串的,也就是有一段中的这个值从$1~n$都出现过. Code:…