后缀自动机做题记录

目录

  • 后缀自动机做题记录
    • sp1811
    • sp1812
    • sp10570
    • luogu 2463
    • CF873F
    • TJOI2015 弦论
    • AHOI2013 差异
    • HEOI2016/TJOI2016 字符串
    • HAOI2016 找相同字符
    • SDOI2016 生成魔咒
    • ZJOI2015 诸神眷顾的幻想乡
  • 留坑待填
    • 广义SAM
    • 其他
    • NOI原题练习

后缀自动机做题记录

来填之前的坑了。。。考后大概会做做有字符串的综合题吧

sp1811

lcs板子,对于第一个串建出SAM,第二个串在上面跑,即可求出对于每一个位置的后缀的最大匹配长度

sp1812

n串lcs板子,对于每个节点去min即可,但是要注意到当前答案对parent子树上儿子答案取max

sp10570

上面的那个改个多组数据,水水经验 (两分钟获得快乐不是很划算吗

luogu 2463

上面那个的变形,加个差分,数据贼小,输入处理有 丶难敲

CF873F

如何求出每个点的right集合大小? dfs求size即可,对于原串上的点sz初值为1

也可以基数排序求出拓扑序然后倒序求

此题中对于被禁止的点sz处理一下就行了

TJOI2015 弦论

对于每个点,算多次的sz为right集合大小,算一次的sz为1

然后像平衡树上那样递归找就行了,复杂度O(n)

AHOI2013 差异

考虑\(parent\)树上每条边的边权赋为\(len(i)-len(fa_i)\),这样两个节点的贡献就是他们到lca的路径权值和,答案是所有路径权值和

然后考虑有多少条路径经过当前边就可以了

HEOI2016/TJOI2016 字符串

考虑二分答案,即为前缀长度,倍增到对应的SAM的点,check一下当前点的endpos是否有包含[a,b],在parent树上线段树合并预处理出来即可

HAOI2016 找相同字符

考虑把两个拼接起来,parent树上每个节点代表一些字符串,且他们出现的位置是等价的

就可以记录一下在A/B中出现的位置然后统计一下

SDOI2016 生成魔咒

先考虑一个问题:如何用SAM求本质不同的子串个数?

和上面差不多,在parent树上每个点代表一些字符串,且不会重复,每次新加入的点算一下就可以了,拆点不会影响答案

注意此题字符集比较大,用map存出边

ZJOI2015 诸神眷顾的幻想乡

trie树上SAM,参考刘研绎在2015年写的国集论文

留坑待填

要准备NOIP了(悲

广义SAM

就是每次把last拉到1

cf666e

p4081

其他

scoi2012

NOI原题练习

你的名字

品酒带会

你可能感兴趣的:(后缀自动机做题记录)