码迷,mamicode.com
首页 > 其他好文 > 详细

Ideas and Tricks Part III

时间:2020-12-28 11:12:57      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:之间   个数   很多   直接   第一个   后缀   结构   ide   添加   

58.SAM后缀自动机

东西挺多的

SAM中每一个节点都是一个endpos的等价类,节点与节点之间有字符的转移。构成的SAM是一个DAG,每一个在原串中本质不同的子串都唯一对应一条在SAM从初始节点出发的路径

可以发现对于一个节点的那些串,如果以长度升序排序后,前一个串是后一个串的后缀并且长度相差1,那么记最长的那一个串长度为len(x),,最短的一个串为minlen(x),定义后缀链接为这个串最长一个串的endpos不和当前节点的endpos集合相同的节点,那么可以发现len(link(x))=minlen(x),那么可以知道一个点所包含的本质不同子串个数就是len(x)-len(link(x))

首先是其构造,大概流程就是,在构造过程中记录前面一个前缀的节点,在后面添加一个字符的时候,新建一个节点x,先不断地扩展那些没有当前字符转移的节点,把这些节点的这种字符转移转移到当前节点x上,设第一个以前就有这种字符转移的节点为p,转移到的节点为q,如果len(q)=len(p)+1,那么直接把x的后缀链接设为q,否则克隆出一个新节点cl,令len(cl)=len(p)+1并且把所有小于其长度的节点重定向为cl,最后把q和x连接到cl上

可以发现link(x)形成了一个树形结构,那么这棵树就叫parent树,这棵树有很多性质

如果设那些前缀节点为终点,那么终点的endpos集合就是对应前缀的下标,那么对于任意一个节点来说,其endpos集合就是这个节点在parent树上子树所有终点

Ideas and Tricks Part III

标签:之间   个数   很多   直接   第一个   后缀   结构   ide   添加   

原文地址:https://www.cnblogs.com/huangchenyan/p/14170713.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!