摘要:
题面 "题目传送门" 解法 后缀数组模板题吧…… 将字符串两倍,然后求一遍sa数组即可 时间复杂度:$O(n\ log\ n)$ 代码 cpp include define N 200010 using namespace std; char st[N]; int len; struct Suffi 阅读全文
摘要:
题面 "题目传送门" 解法 建出kruskal重构树,然后变成求子树第$k$大问题 直接主席树即可 时间复杂度:$O(q\ log\ n)$ 代码 cpp include define N 200010 using namespace std; template void read(node &x) 阅读全文
摘要:
题面 "题目传送门" 解法 枚举最后的二进制位,假设是第$k$位 问题就转化成有多少段和二进制意义下第$k$位是1 不妨转化成前缀和 变成有多少对$i,j(i j)$,使得$s_i s_j$的第$k$位是1 我们可以枚举$k$,假设$s_i$的第$k$位是1 如果$s_i s_j$的第$k$位是1, 阅读全文
摘要:
题面 "题目传送门" 解法 比较套路的一道题吧 先求出height数组,二分答案$mid$ 将后缀分成若干组,每一组满足height≥mid 若某一组的后缀个数≥k,那么答案可行 时间复杂度:$O(n\ log\ n)$ 代码 cpp include define N 1000010 using n 阅读全文
摘要:
题面 "题目传送门" 解法 每一次选的时候比较左端点为起点的后缀与右端点为起点的原串倒序的后缀哪一个字典序小,小的那个相应地移一下即可 感觉这比较绕啊,举个例子解释一下 假设当前的串为$AABCAA$,$l=1,r=6$ 那么只要比较$AABCAA$和$AACBAA$哪一个字典序小,发现是$AABC 阅读全文
摘要:
题面 "题目传送门" 解法 用后缀数组求出height数组,然后暴力即可 时间复杂度:$O(n^2)$ 代码 cpp include define N 3010 using namespace std; template void read(node &x) { x = 0; int f = 1; 阅读全文
摘要:
题面 "题目传送门" 解法 不妨把每一个国家看成一组询问 那么,对于每一组询问显然满足单调性,可以二分答案 但是如果一个一个二分就比较慢,所以需要引入整体二分这个东西 整体二分就是二分当前答案,将可行的放在左边,不可行的放在右边,然后分别递归处理 本题用树状数组处理区间加减即可 时间复杂度:$O(q 阅读全文
摘要:
题面 "题目传送门" 解法 显然,我们只要求出两两后缀的lcp的和即可 两个后缀的lcp长度为这两个后缀的rnk区间height的最小值 那么可以发现,对于$height_i$,我们可以求出以它为最小值的区间个数,然后乘起来即可 求区间可以使用单调栈解决 时间复杂度:$O(n\ log\ n)$ 代 阅读全文
摘要:
题面 "题目传送门" 解法 比较裸的矩阵乘法 对于爆炸,我们可以将所有点全部连向0,但是0没有出边 对于在某一个城市停留,直接连一个自环即可 时间复杂度:$O(n^3)$ 代码 cpp include define Mod 2017 using namespace std; template voi 阅读全文
摘要:
题面 "题目传送门" 解法 发现可持久化数据结构并不能维护这个东西 所以考虑整体二分 在求的时候把$[1,mid]$的所有数的位置+1,然后比较整个矩阵内比$mid$大的数是否比$k$大 时间复杂度:$O((n^2+q)\ log^2\ n)$ 代码 cpp include define M 600 阅读全文