首页 > 其他分享 >「Note」字符串方向 - 自动机相关f

「Note」字符串方向 - 自动机相关f

时间:2023-08-15 17:22:05浏览次数:37  
标签:ch fa 后缀 Note fail 字符串 自动机 节点

1. AC 自动机 ACAM

1.1. 介绍

AC 自动机用于解决多模式串匹配问题,例如求多个模式串在文本串中的出现次数。显著地,它的应用实际上非常广泛。

借助 KMP 的思想,我们对 Trie 树上的每个节点构造其失配指针 \(fail_i\),指向对于当前字符串的最长后缀(其他(前缀)作为当前串后缀的最长的一个),显著地,每个节点的失配指针都指向一个更短的状态。当这样的后缀不存在时,失配指针会指向表示空串的根节点。

考虑如何构建 \(tail_i\):

根据每个节点的失配指针都指向一个更短的状态这个性质,考虑用 BFS 解决 \(tail_i\) 的构建,对于当前节点 \(now\) 来说,假设深度较小的节点都已经被处理完了。

现在假设当前节点 \(i\) 由 \(fa_i\) 经过字符 \(ch\) 转移过来,使 \(tail_i\leftarrow trans(fail_{fa_i},ch)\),若不存在 \(fail_{fa_i}\) 通过 \(ch\) 转移到的某一节点,则尝试使 \(fail_i\leftarrow trans(fail_{fail_{fa_i}},ch)\)。直到 \(fail\) 指向根节点,说明根本不存在合法前缀,我们使 \(fail_i\leftarrow rt\)。

特殊地,若不存在 \(trans(fa,ch)\) 这个转移方式,则直接令 \(trans(fa,ch)\leftarrow trans(fail_{fa_i},ch)\)。

1.2. 常见技巧

1.2.1 \(fail\) 树的性质

构建的 \(fail\) 指针会形成一棵树,称为 \(fail\) 树。这不是废话吗。

  1. \(fail\) 树为一颗有根树,可以进行树剖等树上操作。
  2. 对于节点 \(p\) 与其对应字符串 \(t_p\),对于任意一个子树内节点 \(q\),都有 \(t_p\) 是 \(t_q\) 的后缀。逆命题亦成立。
  3. 设 \(cnt_p\) 表示作为 \(t_p\) 后缀的字符串数量。若无重复串,则 \(cnt_p\) 为树上节点 \(p\) 到根节点上字符串节点数量。

1.2.2 应用

ACAM 可以与 DP 结合,在自动机中进行 DP。

2. 后缀自动机 SAM

咕咕咕

标签:ch,fa,后缀,Note,fail,字符串,自动机,节点
From: https://www.cnblogs.com/Eon-Sky/p/17631535.html

相关文章

  • Python语言中如何实现字符串拼接?
    在学习和应用Python语言的过程中,我们经常会遇到字符串拼接的问题,其实不管是Python还是其他语言,都把字符串列为最基础和最不可或缺的数据类型,拼接字符串也是必备的一项技能,那么Python语言如何实现这个操作呢?以下是详细的内容:1、加号法使用简单直接,但这种方法效率低......
  • burpsuite靶场----SQL注入7----确定某个字符串所在列
    burpsuite靶场----SQL注入7----确定某个字符串所在列靶场地址https://portswigger.net/web-security/sql-injection/union-attacks/lab-find-column-containing-text正式开始1.Makethedatabaseretrievethestring:'P4cni8'说要让数据库检索'P4cni8'2.点击标签3.确......
  • [Notes] Ubuntu下设置apt-get的代理
    根据不同的ubuntu版本,可以修改/etc/apt/apt.conf文件或者/etc/apt/apt.conf.d/proxy.conf文件的内容。/etc/apt/apt.conf.d/proxy.conf添加如下内容可以实现apt-get的代理设置:Acquire::http::Proxy"http://127.0.0.1:7894";Acquire::https::Proxy"http://127.0.0.1:7894";......
  • ChatGPT 问答00015 Java中如何判断字符串中含有3个以上日语字符
    要判断一个字符串中是否包含3个或更多日语字符,可以使用Java的正则表达式进行匹配,并配合计数器来统计匹配到的日语字符数量。以下是一个示例的Java代码:importjava.util.regex.*;publicclassMain{publicstaticvoidmain(String[]args){Stringstr="Hell......
  • 字符串补齐
    1ALTERfunction[dbo].[字符串补齐]2(3   @sqlvarchar(200), --需填充的字符串45   @charvarchar(4),  --填充使用的字符67   @lenint           --填充后的长度8)910returnsvarchar(200)1112as1314begin......
  • 字符串分段
    1ALTERfunction[dbo].[字符串分段](@STRvarchar(80),@xint,@jgfvarchar(10))2returnsvarchar(100)3begin4set@str=REPLACE(@str,'','')5Declare@lengthint=len(@str)6Declare@indexint=17Declare@yhkvarchar(100)='�......
  • JSON对象和字符串之间的相互转换
    比如我有两个变量,我要将a转换成字符串,将b转换成JSON对象:1vara={"name":"tom","sex":"男","age":"24"};23varb='{"name":"Mike","sex":"女","age":"29......
  • 2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符
    2023-08-14:用go语言写算法。给出两个长度相同的字符串str1和str2,请你帮忙判断字符串str1能不能在零次或多次转化后变成字符串str2,每一次转化时,你可以将str1中出现的所有相同字母变成其他任何小写英文字母,只有在字符串str1能够通过上述方式顺利转化为字符串......
  • 2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符
    2023-08-14:用go语言写算法。给出两个长度相同的字符串str1和str2,请你帮忙判断字符串str1能不能在零次或多次转化后变成字符串str2,每一次转化时,你可以将str1中出现的所有相同字母变成其他任何小写英文字母,只有在字符串str1能够通过上述方式顺利转化为字符串str2......
  • json字符串转换对象或列表,多了字段不会报错
    json字符串转换对象或列表,多了字段不会报错//DEMO1转换对象应用riskIdpublicclassItem{privateStringid;privateStringrate;publicItem(Stringid,Stringrate){this.id=id;this.rate=rate;}@Overridepubl......