【算法竞赛学习笔记】后缀自动机SAM-超经典的字符串问题详解

本文详细介绍了后缀自动机(Suffix Automaton, SAM)的概念、性质和构造过程,包括定义、符号解释、转移函数、后缀链接、子串表示法等。此外,还探讨了如何利用SAM解决子串查询、最小循环位移、不同子串个数、最长公共子串等经典问题,并提供了相关例题和参考资料。" 102418041,7373988,Maven资源文件打包配置详解,"['maven', '构建工具', '资源文件', '打包配置']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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]iendpos(sta)}

trans(sta,c)={ x∣mxsub(sta+(c∈subs(x))}trans(sta,c)=\{x|mxsub(sta+(c\in subs(x))\}trans(sta,c)={ xmxsub(sta+(csubs(x))}

后缀链接link

sta状态链接到下一个连续后缀所在的状态,叫做后缀链接。

子串表示法

用一个点的集合以及长度len来描述一个子串

Parent树
引理1

两个非空子串u和w(假设∣u∣≤∣w∣)的endpos相同,当且仅当字符串u是w的后缀。两个非空子串u和w(假设|u|\leq|w|)的endpos相同,当且仅当字符串u是w的后缀。uw(uw)endposuw

对于任意一个状态stastasta,任取str∈subs(sta)str\in subs(sta)strsubs(sta),都有strstrstrmxsub(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|uw),要么endpos(u)∩endpos(w)=∅endpos(u)\cap endpos(w)=\emptyendpos(u)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RWLinno

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值