提高组字符串专题做题记录

提高组字符串专题做题记录

A [NOIP2020] 字符串匹配

考虑枚举循环节长度和循环次数,利用哈希判断合法,然后我们就可以求出 \(f(C)\) 了。此时我们需要在前 \(i\) 个前缀中找出满足 \(f(A)\le f(C)\) 的前缀有多少个,看上去可以用树状数组简单维护出来,但实际上由于 \(f(S)\) 的值最多只有 \(27\) 种,因此暴力修改前缀和的复杂度反而更优。使用树状数组复杂度为 \(O(n\ln n\log n)\),而暴力前缀和的复杂度是 \(O(n(\ln n+27))\)

B [CF965E] Short Code

看到前缀直接考虑 Trie 树,然后不难发现题目的要求相当于是给定树上一些点,可以将某些点挪到它的祖先,但是点的位置不能重复,求最后每个点放置位置的深度之和最小值。

考虑用堆维护出当前节点子树内点的深度,如果当前点没有点,那么就将子树中深度最大的点换过来。向上传递的时候可以考虑启发式合并,继承重儿子的堆。时间复杂度 \(O(n\log^2 n)\)

C 串串题

考虑先将 \(A\) 中所有没有在 \(B\) 中出现过的数删掉,然后跑 KMP,即可求出 \(B\) 每一次出现只能在 \(A\) 的那些区间出现。然后考虑一个区间,这个区间中会出现一些不在 \(B\) 中出现的数字,我们只要将它们删去即可。考虑拆贡献,我们可以算出选出的数包含区间中这些数的方案数,那么这个区间会给这些方案贡献 \(1\) 的答案。组合数计算即可。

现在的问题就是求出一个区间中出现的数的种类,显然可以用莫队求解。由于我们的区间保证了左右端点均递增,因此这个莫队实际上就是双指针,复杂度 \(O(n)\)

D [COCI 2016-2017 #1] Cezar

考虑求出最后得到的序列,然后比较相邻两个字符串,找到它们第一个不同的字符。假设是 \(c_1,c_2\),那么意味着 \(c_1\) 在密钥中的权值小于 \(c_2\) 在密钥中的权值。因此连边 \(c_1\to c_2\)。接下来拓扑排序,按照拓扑序为每一个字符分配权值即可,有环则说明无解。

E [CSP-S 2023] 消消乐

考虑我们从左往右走,维护一个栈序列。每一次和栈顶元素比较,如果相同就弹栈,否则压入当前字符。我们对整个栈序列进行哈希,如果当前位置 \(i\) 求出的栈序列在之前的 \(j\) 就被求出过,那么就说明 \((j,i]\) 是一个合法的子串。用 map 存储下每一种哈希值的数量并统计答案即可。

^F [CSP-S 2022] 星战

不可以,总司令!

考虑到原题中的限制条件等价于图是一张内向基环树森林,因此本质上只需要保证每个点出度为 \(1\) 即可。考虑出度并不好维护,但是入度容易维护出来。并且我们知道入度等于出度,所以入度满足条件是出度满足条件的必要条件,但并不充分。

考虑使用哈希使得条件充分的概率尽可能大。我们对每一个点随机赋权值 \(w\),对每个点维护连向它的点的权值之和 \(s\)。那么所有点出度为 \(1\) 就意味着 \(s\) 之和恰为 \(w\) 之和。由于哈希的随机性,其有很大概率可以满足条件充分,可以通过。复杂度 \(O(n)\)

^G [CF1777F] Comfortably Numb

首先将区间异或和转化为两个前缀异或和的异或。然后考虑建立笛卡尔树。这样我们处理一个区间的时候就可以直接确定最大值所在位置,我们只需要从左右两边各选出一个前缀异或和求最大值即可。

我们考虑枚举一边选的位置,然后只需要在另一边找出异或 \(s_x\oplus mx\) 最大的一个 \(s_y\),显然使用 01-Trie。然后我们将两边的 01-Trie 合并起来上传即可。但是直接做的复杂度最坏是 \(O(n^2\log V)\) 的,考虑启发式合并,每次枚举长度较小的区间,合并较小的 01-Trie,这样的复杂度就是 \(O(n\log n\log V)\) 了。

^H [CF1771F] Hossam and Range Minimum Query

考虑到题目要求在线,因此不能使用莫队求解。

考虑到有数字出现奇数次意味着区间内异或和不为 \(0\),这是数字出现奇数次的必要条件,但不充分。和 F 题一致,我们给每一种数字赋上随机权值,然后再进行异或,此时这个条件的充分性概率就大大提高。

考虑怎样求出最小的满足条件的数。考虑使用主席树,在主席树上的每一段区间 \([l,r]\) 维护该值域区间内所有数对应随机权值的异或和。查询的时候在主席树上二分,如果左区间异或和不为 \(0\) 就递归左区间,否则递归右区间。复杂度即为主席树复杂度,为 \(O(n\log n)\)

posted @ 2024-11-22 17:45  UKE_Automation  阅读(11)  评论(0编辑  收藏  举报