随笔分类 - 字符串 - 后缀自动机
摘要:一个比较暴力的解法. 先对所有串建出广义后缀自动机提取出后缀树然后按照询问的右端点离线. 考虑插入第 $i$ 个串,那么会被 $i$ 及 $i$ 的祖先遍历到的点的表示范围会从 $[l,r] \rightarrow [l,r+1]$. 未被遍历到的点的表示范围出现了一个“断点”,则表示范围就是 $i
阅读全文
摘要:比较好的一道后缀自动机题. 先枚举必选的前缀 $[1,k]$ 然后加上 $[k+1,n]$ 中本质不同子串个数. 但是这样的话会算重. 考虑哪些地方算多了: 假设 $i-1$ 的前缀为 $pre[i-1]$,然后当前的前缀为 $pre[i-1]+x$. 那么当前肯定会枚举到 $pre[i-1]+(x
阅读全文
摘要:怎么想都没想出来 $\log n$ 做法,那么这道题基本就是根号分治了. 题目描述中保证 $\sum k \leqslant 10^5$,然后 $k$ 在每次询问中又是相同的,那么就考虑对 $k$ 根号分治. 先对 $s$ 建立后缀自动机,然后把倍增数组求出来. 我们设块的大小为 $B$,那么当 $
阅读全文
摘要:并不难的一道字符串题. 显然后缀自动机上进行字典树的启发式合并. 但是一定注意,题中要求的是两个后缀的 LCP 而不是两个前缀的 LCP. 所以在构建后缀自动机的时候要从后向前构建. 刚开始从前向后构建 WA 了半天. 然后进行启发式合并的时候可以对每个节点维护一个 id[x],如果儿子的大小大于点
阅读全文
摘要:问题可以转化为:$A$ 与 $B$ 所有前缀一一配对,LCP 之和最大是多少. 构建后缀树,然后对于点 $x$,若 LCP 为 $x$ 则贡献就是 $x$ 子树中 $A$ 点和 $B$ 点较小数量. 我们发现如果要求和最大,就贪心匹配. 由于后缀树中点 $x$ 的长度为 mx[x] ~ mx[pre
阅读全文
摘要:不难的一道字符串题. 建立 $T$ 的 SAM,然后根据 $S$ 中的询问按照右端点离线,依次在 $T$ 的 SAM 上匹配. 查询的时候分两种情况讨论一下,用线段树维护就行了. code: #include <cstdio> #include <cstring> #include <algorit
阅读全文
摘要:好神仙的一道字符串题! 由于后缀自动机+线段树合并的题做多了,看到复杂字符串的时候直接往 right 集合和后缀树那方面想了. 所以就没想出来 QAQ.... 这道题还是要从序列上来思考. 我们发现最优解一定可以表示成一个长度依次为 $1$ ~ $ans$ 字符串集合. 令 $dp[i]$ 表示以
阅读全文
摘要:将问题转化为统计以 $i$ 结尾的 $AA$ 串个数. 我们将后缀树建出来,然后按照启发式合并的方式每次合并两个 $endpos$ 集合. 那么就有:$[x-mx,x-1] \rightarrow x$ 与 $x \rightarrow [x+1,x+mx]$ 的贡献. 统计第一种贡献的话在线段树上
阅读全文
摘要:第一次写这个题是好长时间以前了,然后没调出来. 本来以为是思路错了,结果今天看题解发现思路没错,但是好多代码细节需要注意. code: #include <cstdio> #include <vector> #include <map> #include <cstring> #include <al
阅读全文
摘要:就是喜欢后缀自动机,yy了一个只用后缀自动机解决的方法. 对 3 个串建立广义后缀自动机,然后建立后缀树. 标记出每个点在0/1/2个串中是否作为子串出现,然后将后缀树中 2 串结尾的所有子树都设为危险节点. 然后对于 SAM 来一个拓扑序DP,我们开始的时候默认危险节点的最大值是 -inf,然后
阅读全文
摘要:绝对是我写过最长的一份代码了. 这个快敲吐了. 通过这道题能 get 到一个套路: 两颗树同时统计信息的题可以考虑在个树上跑边分治,把点扔到另一颗树的虚树上,然后跑虚树DP. 具体地,这道题中我们发现 $LCP$ 长度是反串后缀树 $LCA$ 深度,$LCS$ 是正串后缀树 $LCA$ 深度. 我们
阅读全文
摘要:裸题,敲完后没调就过了 ~ code: #include <bits/stdc++.h> using namespace std; #define ll long long #define lson t[x].ls #define rson t[x].rs #define setIO(s) freo
阅读全文
摘要:联赛前练练码力. code: #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #define N 200006 #define ll long long #define lson t[x].ch[
阅读全文
摘要:太累了,刷刷水~ code: #include <bits/stdc++.h> #define N 500005 #define LL long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; char str
阅读全文
摘要:并不是很难啊,把细节想好了再写就很轻松了~ code:
阅读全文
摘要:水水的字符串题 ~
阅读全文
摘要:求树上两条路径的 LCP (树上每个节点代表一个字符) 总共写+调了6个多小时,终于过了~ 绝对是我写过的最复杂的数据结构了 我们对这棵树进行轻重链剖分,然后把所有的重链分正串,反串插入到广义后缀自动机中. 求 LCP 的话就是后缀树中两点 $LCA$ 的深度. 如果 $LCP$ 的长度小于两个重链
阅读全文
摘要:这题解法很多,简单说几个: 1. 线段树合并,时间复杂度是 $O(nlog^2n)$ 的. 2. 暴力跳 $fail,$ 时间复杂度 $O(n\sqrt n),$ 比较暴力. 3. 建立后缀树后在 $dfs$ 序上数点,时间复杂度为 $O(nlogn),$ 十分优秀. Code:
阅读全文
摘要:刷刷水~ Code:
阅读全文
摘要:比较考验对后缀自动机构建过程的理解. 之前看题解写的都是树链的并,但是想了想好像可以直接撤销,复杂度是线性的. 自己想出来的,感觉后缀自动机的题应该不太能难倒我~ 注意:一定要手画一下后缀自动机的构建过程,然后看着自己画的图一步一步模拟即可. Code:
阅读全文

浙公网安备 33010602011771号