ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

后缀自动机详解

2021-03-09 18:05:37  阅读:189  来源: 互联网

标签:子串 后缀 mac 详解 endpos 自动机 preNode 节点


当想让学妹看博客时,怕旧的写的太烂被嫌弃,又怕新的看不懂……哎

一、定义:

单词的有向无环图

二、作用

从原点出发形成的所有路径即为单词的所有子串,并且通过维护endpos和endpos类,得知每个串出现的次数和出现的位置

三、构建后缀自动机

一些性质:

  1. endpos :数集,一些子串他们出现的位置相同,这些位置的集合称为endpos

  2. endpos类 :串集,一些子串他们出现的位置相同,这些子串的集合称为endpos类

  3. fail树

  • 树上节点的endpos是他父亲节点endpos的真子集

  • 树上节点的父亲包含的子串是当前节点包含的子串的后缀

  • 树上节点的endpos类中的子串长度连续

  • 树上节点的endpos类中的最小长度等于他父亲节点endpos类中的最长长度+1

后缀自动机维护的东西:

  1. fail树上的父亲

  2. c边连向的点

  3. endpos类中最长串的长度

以上是一些概念,由他的性质和用途决定,就像1+1=2一样解释不了,早出生一点也许就不这样了呢

这些概念性的东西介绍完毕之后,就要开始讲如何维护了

考虑每次新添加一个字符进后缀自动机中(新开一个节点),改变的只有未添加新字符的所有后缀,就相当于在原来的终止节点后添加一个字符,长度+1,且每个终止节点都要向他引出一个c边,而由性质我们可以知道当前终止节点的所有祖先既终止节点集,当最终跳到源点的时候就表示,旧串中没有新形成的字符串的后缀,说明没有节点会发生改变,所以新节点的父亲指向1就可以了,所那么如下代码的意义就解释完毕:

int preNode = lastNode;
int nowNode = lastNode = ++tot;
mac[nowNode].len = mac[preNode].len+1;
for(;preNode&&!mac[preNode].ch[c];preNode = mac[preNode].fa) mac[preNode].ch[c] = nowNode;
if (!preNode) mac[nowNode].fa = 1;

如果旧串中存在新形成的字符串的后缀呢?那么说明现在的preNode之前的节点会发生改变,额……待我仔细斟酌一下再下笔,毕竟要吃饭了

标签:子串,后缀,mac,详解,endpos,自动机,preNode,节点
来源: https://www.cnblogs.com/little-uu/p/14507070.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有