后缀自动机学习小记
后缀自动机学习小记
后缀自动机(\(\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}\)就行了
还要注意贪心求答案时一些细节