后缀树
DZYO
Never stop
展开
-
后缀树
在pongba的讨论组上看到一道Amazon的面试题:找出给定字符串里的最长回文。例子:输入XMADAMYX。则输出MADAM。这道题的流行解法是用后缀树(Suffix Tree)。这坨数据结构最酷的地方是用它能高效解决一大票复杂的字符串编程问题: 在文本T里查询T是否包含子串P(复杂度同流行的KMP相当)。 文本T里找出最长重复子串。比如abcdabcefda里abc同da都重复出现,转载 2017-03-15 16:27:04 · 491 阅读 · 0 评论 -
BJ模拟:最长公共前缀(SAM+虚树)
传送门 题意: BZOJ3879的树上版本。 题解: 实际上我们也可以维护后缀数组做,只需要多一个后缀平衡树。 不过这道题建广义SAM更方便,因为Trie树上所有节点到根的路径都是后缀,我们只需要把SAMSAMSAM建出来即可得到后缀树,两个串的lcp为在后缀树上的lca的长度,然后每次询问建虚树DPDPDP即可。 不过需要注意的是trie树上建SAMSAMSAM的复杂度是错的,所以还...原创 2018-04-10 10:51:47 · 465 阅读 · 0 评论 -
Codeforces Round #349 (Div. 1) (666E) :E. Forensic Examination(后缀树)
传送门 题解: 先把所有串连接起来,用后缀自动机建后缀树(前缀树?)。 一个串在另一个串中以子串形式出现,那么一定是子串某个前缀的后缀。 利用后缀自动机的性质,我们把所有模式串的每个结束位置都标记,那么包含匹配串的模式串的结束位置在fail树上的位置位于当前位置的子树中。线段树合并即可。 注意找结束位置需要子串定位,我们倍增 fail链。 #include <bits/stdc...原创 2018-04-23 11:13:24 · 181 阅读 · 0 评论 -
BZOJ1921: [Ctsc2010]珠宝商(点分治+SAM)
传送门 题解: 点分治,如果点数≥n\ge \sqrt{n}≥n,则结合后缀树O(sze+m)O(sze+m)O(sze+m)处理出每个位置的开始,结束点并统计答案。否则从每个点开始暴力扩展路径。 时间复杂度O(nn)O(n \sqrt{n})O(nn)。 #include <bits/stdc++.h> using namespace std; typedef pair <...原创 2018-09-20 15:05:37 · 358 阅读 · 0 评论