Loading docs/string/ac-automaton.md +2 −2 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ KMP 自动机:一个不断读入待匹配串,每次匹配时走到接受状 共有 $m$ 个状态,第 $i$ 个状态表示已经匹配了前 $i$ 个字符。 定义 $trans_{i,c}$ 表示状态 $i$ 读入字符 $c$ 后到达的状态,$next_{i}$ 表示 [prefix function](../prefix-function),则有: 定义 $trans_{i,c}$ 表示状态 $i$ 读入字符 $c$ 后到达的状态,$next_{i}$ 表示 [prefix function](/string/prefix-function),则有: $$ trans_{i,c} = Loading @@ -20,7 +20,7 @@ $$ (约定 $next_{0}=0$ ) 我们发现 $trans_{i}$ 只依赖于之前的值,所以可以跟 [KMP](../prefix-function/#knuth-morris-pratt) 一起求出来。 我们发现 $trans_{i}$ 只依赖于之前的值,所以可以跟 [KMP](/string/prefix-function/#knuth-morris-pratt) 一起求出来。 时间和空间复杂度: $O(m|\Sigma|)$ Loading docs/string/match.md +1 −1 Original line number Diff line number Diff line Loading @@ -49,4 +49,4 @@ match(char *a, char *b, int n, int m) { ## KMP 算法 参见[KMP](/string/kmp) 参见[KMP](/string/prefix-function/#knuth-morris-pratt) docs/string/trie.md +8 −8 Original line number Diff line number Diff line ## Trie 先考虑怎么存多个串 先考虑怎么存多个串: 一种树,每个结点有 $|∑|$ 个儿子,每条边表示一个字符 一种树,每个结点有 $|∑|$ 个儿子,每条边表示一个字符。 空间 $O(len)$ (如果假设 $|∑|$ 为常数) 空间 $O(len)$ (如果假设 $|∑|$ 为常数)。 要判断某个串是否等于某个模式串,只要在 Trie 上走一遍(线性的) 要判断某个串是否等于某个模式串,只要在 Trie 上走一遍(线性的)。 ## 在 Trie 上 KMP 实际上要做的事情是求出 Trie 的每个节点的 $next$ 值 实际上要做的事情是求出 Trie 的每个节点的 $next$ 值。 当然,这里的 $next$ 不再是一个值,而是相当于是一个指针——它可能指向其他分支的节点。 这时 $next$ 的定义:最长的等于同长度的后缀的从根开始的路径的长度 这时 $next$ 的定义:最长的等于同长度的后缀的从根开始的路径的长度。 求法跟[KMP](/string/kmp)中的一样,只是要改成在 Trie 上[BFS](/search/bfs) 求法跟 [KMP](/string/prefix-function/#knuth-morris-pratt)中的一样,只是要改成在 Trie 上 [BFS](/search/bfs)。 复杂度:均摊分析失效了,其实只能在每条链上均摊分析,于是总复杂度为模式串长总和 复杂度:均摊分析失效了,其实只能在每条链上均摊分析,于是总复杂度为模式串长总和。 Loading
docs/string/ac-automaton.md +2 −2 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ KMP 自动机:一个不断读入待匹配串,每次匹配时走到接受状 共有 $m$ 个状态,第 $i$ 个状态表示已经匹配了前 $i$ 个字符。 定义 $trans_{i,c}$ 表示状态 $i$ 读入字符 $c$ 后到达的状态,$next_{i}$ 表示 [prefix function](../prefix-function),则有: 定义 $trans_{i,c}$ 表示状态 $i$ 读入字符 $c$ 后到达的状态,$next_{i}$ 表示 [prefix function](/string/prefix-function),则有: $$ trans_{i,c} = Loading @@ -20,7 +20,7 @@ $$ (约定 $next_{0}=0$ ) 我们发现 $trans_{i}$ 只依赖于之前的值,所以可以跟 [KMP](../prefix-function/#knuth-morris-pratt) 一起求出来。 我们发现 $trans_{i}$ 只依赖于之前的值,所以可以跟 [KMP](/string/prefix-function/#knuth-morris-pratt) 一起求出来。 时间和空间复杂度: $O(m|\Sigma|)$ Loading
docs/string/match.md +1 −1 Original line number Diff line number Diff line Loading @@ -49,4 +49,4 @@ match(char *a, char *b, int n, int m) { ## KMP 算法 参见[KMP](/string/kmp) 参见[KMP](/string/prefix-function/#knuth-morris-pratt)
docs/string/trie.md +8 −8 Original line number Diff line number Diff line ## Trie 先考虑怎么存多个串 先考虑怎么存多个串: 一种树,每个结点有 $|∑|$ 个儿子,每条边表示一个字符 一种树,每个结点有 $|∑|$ 个儿子,每条边表示一个字符。 空间 $O(len)$ (如果假设 $|∑|$ 为常数) 空间 $O(len)$ (如果假设 $|∑|$ 为常数)。 要判断某个串是否等于某个模式串,只要在 Trie 上走一遍(线性的) 要判断某个串是否等于某个模式串,只要在 Trie 上走一遍(线性的)。 ## 在 Trie 上 KMP 实际上要做的事情是求出 Trie 的每个节点的 $next$ 值 实际上要做的事情是求出 Trie 的每个节点的 $next$ 值。 当然,这里的 $next$ 不再是一个值,而是相当于是一个指针——它可能指向其他分支的节点。 这时 $next$ 的定义:最长的等于同长度的后缀的从根开始的路径的长度 这时 $next$ 的定义:最长的等于同长度的后缀的从根开始的路径的长度。 求法跟[KMP](/string/kmp)中的一样,只是要改成在 Trie 上[BFS](/search/bfs) 求法跟 [KMP](/string/prefix-function/#knuth-morris-pratt)中的一样,只是要改成在 Trie 上 [BFS](/search/bfs)。 复杂度:均摊分析失效了,其实只能在每条链上均摊分析,于是总复杂度为模式串长总和 复杂度:均摊分析失效了,其实只能在每条链上均摊分析,于是总复杂度为模式串长总和。