目录
- 后缀自动机做题记录
- 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原题练习
你的名字
品酒带会