摘要:
BM算法 阅读全文
摘要:
0.一些说明 如果从根节点到$k$的路径上的字符连成的字符串是$s$,那么称字符串$s$对应的节点是$k$,节点$k$对应的字符串为$s$。 关于字符串的一些通用定义 \(s_{i,j}\):字符串$s$的一个子串,这个子串在s中的起始下标为$i$,终止下标为$j$。 父边:链接u的父节点和u的这条 阅读全文
摘要:
1Lyndon 分解 1.1 一些说明 称 \(s_{i,j}\) 为字符串 \(s\) 下标 \(i\) 到 \(j\) 的字符组成的字符串。 记 \(s\in L\) 为 \(s\) 为 Lyndon 串。 记 \(L(s)\) 为串 \(s\) 的 Lyndon 分解。 1.2 一些定义 一个 阅读全文
摘要:
1 简介 后缀数组是后缀树的一个有力的替代品,倍增算法的复杂度是 \(O(n\log n)\) ,这个复杂度在大多数情况下不会成为瓶颈,sa-is 算法留着以后再学。 后缀数组所做的事情是把所有的后缀拿出来,然后按照字典序排序。 2 算法讲解 我们先把所有单个字符排序,实际上是给所有后缀的第一个字符 阅读全文
摘要:
1 最小表示法一般求解方法: 我们采用双指针的方法去求最小表示,在下面的代码中 \(k\) 为字符串长度,\(i,j\) 分别为两个字符串的开始节点,容易知道,如果两个字符串失配了,那么其中那个大的失配的,假设是 \(i\) ,那么 \(i+k-1\) 都不可能成为答案了。因为一定存在一个字符串比他 阅读全文
摘要:
子序列自动机 1 简介 子序列自动机可以解决多次子串匹配。 给定一个字符串 \(t\) ,一共有 \(q\) 次询问,每次给定另外一个字符串 \(s\) ,询问 \(t\) 在 \(s\) 中出现了多少次。 我们跑 \(q\) 遍 KMP 就可以了。如果我们把这道题改成子序列匹配呢? 于是就有了这道 阅读全文
摘要:
可持久化线段树 可持久化实际上是一类思想。就是在修改的时候我们先把节点复制过来然后再复制的节点上修改。其他信息不变。 由于线段树每一次修改会改变根节点到一个节点上的路径,所以每一次修改都会新建一个根节点,所以可持久化线段树并不是一个树形结构,而是一张图。 例题 #include<iostream> 阅读全文
摘要:
可持久化Trie 基本上所有的可持久化数据结构都可以理解为继承与修改,继承之前的,再加入新的修改。 蛮好写的,size数组可以理解为在同一位深度的节点是第几个添加的,这样就为判断是在l前还是在l后准备了依据。 代码: #include<iostream> #include<cstdio> #incl 阅读全文
摘要:
自动机入门——回文自动机 PAM 1 算法简介 回文自动机,也称为回文树,是由俄罗斯人 MikhailRubinchik 在 \(2014\) 年夏发明的,回文树可以高效的解决一系列设计回文串的问题。 2 结构 回文树由转移边和后缀链接组成,每一个节点可以代表一个回文子串,因为回文串长度分为奇数和偶 阅读全文
摘要:
manacher 算法 1 算法简介 manacher 算法是一个求字符串中最长回文连续子序列的算法,可以达到 \(O(n)\) 的复杂度。 2 算法 我们可以在每一个字符之间补上一个 ‘#’ 这样所有的回文串就都会变成长度为奇数的回文串,我们用 \(len_i\) 表示从 \(i\) 点能够扩展出 阅读全文