后缀自动机学习小记

后缀自动机学习小记

后缀自动机(\(\text{SAM}\))是处理字符串的利器,它存储了字符串\(S\)的每一个后缀,并且可识别\(S\)的每一个子串,且支持在线\(O(n)\)构建,这里记录了几道练习题。(持续更新)


洛谷P3804 【模板】后缀自动机 (SAM)

一个子串的出现次数其实就是它在后缀自动机中对应状态的\(\text{endpos}\)集合的大小,我们把后缀自动机建出来,然后在\(\text{Parents}\)树上跑个\(\text{DP}\)即可。


「SDOI2016」生成魔咒

求不同子串数量,直接在\(\text{SAM}\)上跑\(\text{DP}\)即可。

当然,我们也可以考虑每一个状态\(i\)的贡献,其实就是\(\text{len}_i - \text{len}_{\text{link}_i}\),累加即可


「TJOI2015」弦论

根据\(\text{Trie}\)的经验,我们只需要求出\(\text{SAM}\)上每个状态对应的子串数然后贪心选就行了。

\(t=0\)时,和「SDOI2016」生成魔咒的\(\text{DP}\)是一样的

\(t=1\)时比较难办,但是我们发现一个子串的出现次数显然就是它对应状态的\(\text{endpos}\)集合的大小,再加个树形\(\text{DP}\)就行了

还要注意贪心求答案时一些细节

posted @ 2022-07-07 20:48  DCH233  阅读(45)  评论(0编辑  收藏  举报