title : 后缀自动机
date : 2021-11-11
tags : ACM,字符串
author : Linno
前置知识
KMP,Trie,AC自动机等字符串基础
DFA(有限状态自动机)
后缀自动机(Suffix automaton ,SAM)
定义
字符串s的SAM是一个接受s的所有后缀的最小DFA(确定性有限自动机)。直观上SAM是给定字符串的所有字串的压缩形式。而构造的时间复杂度和空间复杂度仅为O(n)O(n)O(n)。一个SAM最多有2n-1个节点和3n-4条转移边。
符号定义
endpos(t)为字符串s中t的所有结束位置,endpos的集合即为SAM的状态集
subs(sta):SAM中sta状态所包含的所有子串的集合
mxsub(sta):sta状态所包含的子串中最长的子串
mnsub(sta):sta状态所包含的子串中最短的子串
sz[i]:sta表示的endpos集合大小,即i号点字符串集合在整个串出现次数
nxt(sta):sta遇到的下一个字符集合
link(sta):
性质
状态数:不超过2n-1
转移数:不超过3n-4
DAG性质DAG性质DAG性质:SAM是有向无环图,因此可以用DP计算路径条数。
状态集:所有endpos的集合即为SAM的状态集。
转移函数
nxt(sta)={ S[i+1]∣i∈endpos(sta)}nxt(sta)=\{S[i+1]|i\in endpos(sta)\}nxt(sta)={ S[i+1]∣i∈endpos(sta)}
trans(sta,c)={ x∣mxsub(sta+(c∈subs(x))}trans(sta,c)=\{x|mxsub(sta+(c\in subs(x))\}trans(sta,c)={ x∣mxsub(sta+(c∈subs(x))}
后缀链接link
sta状态链接到下一个连续后缀所在的状态,叫做后缀链接。
子串表示法
用一个点的集合以及长度len来描述一个子串
Parent树
引理1
两个非空子串u和w(假设∣u∣≤∣w∣)的endpos相同,当且仅当字符串u是w的后缀。两个非空子串u和w(假设|u|\leq|w|)的endpos相同,当且仅当字符串u是w的后缀。两个非空子串u和w(假设∣u∣≤∣w∣)的endpos相同,当且仅当字符串u是w的后缀。
对于任意一个状态stastasta,任取str∈subs(sta)str\in subs(sta)str∈subs(sta),都有strstrstr是mxsub(sta)mxsub(sta)mxsub(sta)的后缀。
例如:subs(7)={aabbab,abbab,bbab,bab}
任取一个字符串str,str是mxsub(7)=aabbab的后缀。
SAM中一个状态所包含的子串的集合是由长度连续的一系列字符串构成,并且由长到短,依次减少最前面的字符。
引理2
两个非空子串u和w(假设∣u∣≤∣w∣|u|\leq|w|∣u∣≤∣w∣),要么endpos(u)∩endpos(w)=∅endpos(u)\cap endpos(w)=\emptyendpos(u)∩