后缀自动机基本概念

版权声明:本文为博主原创文章,你们可以随便转载 https://blog.csdn.net/Jaihk662/article/details/82823251

来源:http://hihocoder.com/problemset/problem/1441

hihocoder已经讲的很清楚了,这里就简略的描述一下吧

一、什么是后缀自动机

对于字符串S = "aabbabd",它的后缀自动机是:

图中可以看出一些性质:

  1. 从S出发到终结点9总共有7条不同的路径,其中每条路径都对应着"aabbabd"中的一个后缀,无遗漏且不重复,注意每一个终结点绿色虚线所指向的点仍然是终结点(这个可以以后再理解为什么,很显然该图片中的终结只有9和S)
  2. 对于S所有的子串,一定能在自动机中找到一条从S出发的路径
  3. 同理,对于所有不属于S的子串,一定不能在自动机中找到一条从S出发的路径(例如"aba"不是"aabbabd"的子串,就无法找到其从S出发的合法路径)
  4. 节点个数≥字符串中字符个数

除此之外,绿色的虚线不属于FDA(确定性自动机),但它是SAM的重要部分

 

二、有关后缀自动机的一些变量/函数

(1)endpos:对于S的一个子串st,endpos(st) = st在母串S中所有出现的结束位置集合

对于例子字符串S = "aabbabd",所有Endpos构成的表如下

endpos的性质:

对于S的两个子串s1和s2,如果len(s1) ≤ len(s2),那么s1是s2的后缀当且仅当endpos(s2) ⊆ endpos(s1),s1不是s2的后缀当且仅当endpos(s1) ∩ endpos(s2) = ∅,例如图中以节点8结尾的所有串("ab")都一定是图中以节点7结尾的所有串("aabbab", "abbab", "bbab", "bab")的后缀

(2)longest(k)/shortest(k):S到节点k的所有子串中,最长的那个和最短的那个

例如longest(7) = "aabbab",shortest(7) = "bab"

再通过endpos,就可以看出子串是如何划分的了,还有它们的一些性质:

  • 对于所有同一个节点的子串,一定满足集合endpos()相同
  • 同上,endpos()相同的所有子串一定属于同一个节点,并且这些字符串是一段连续的后缀
  • longest(k)/shortest(k)也可以理解为是满足endpos()为某个特定集合的情况下,最长的那个和最短的那个
  • 后缀自动机中节点个数 = 不同的endpos()集合个数
  • 后缀自动机中子串个数 = 所有节点的 longest(k)-shortest(k)+1 之和
  • 从S到节点k的路径个数 = longest(k)-shortest(k)+1

(3)trans(k, ch):longest(k)后面接上字符ch,得到的新字符串所在的节点

例如图中trans(1, 'a') = 2,trans(1, 'b') = 8,trans(6, 'b') = 7

三、后缀自动机的Suffix Links

Suffix Links即图中的绿色虚线

很容易发现(上面也说了):对于当前节点k,longest(k)到shortest(k)一定是一段连续的后缀,例如节点为7的所有子串就是从"aabbab"到"bab"这一段连续的后缀,而这段连续的后缀到shortest()后就截断了,用直白的话说:7号节点中所有子串"aabbab", "abbab", "bbab", "bab",下个串应该是"ab",而串"ab"在8号节点中,那么7到8就要连一条Suffix Links,pre[7] = 8

几个很重要的性质:

  • 如果存在两个节点u, v满足pre[v] = u,也就是有一条从v连向u的Suffix Links那么保证 endpos(v) ⊆ endpos(u),且不存在任何节点k满足 endpos(v) ⊆ endpos(k) 且 endpos(k) ⊆ endpos(u)
  • 所有的Suffix Links构成了一颗根节点为0的内向树

猜你喜欢

转载自blog.csdn.net/Jaihk662/article/details/82823251