标签:之间 个数 很多 直接 第一个 后缀 结构 ide 添加
东西挺多的
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树上子树所有终点
标签:之间 个数 很多 直接 第一个 后缀 结构 ide 添加
原文地址:https://www.cnblogs.com/huangchenyan/p/14170713.html