关于其原理和构造啥的先不说,理解性默写就行。
对着题单开始乱水。
P2408不同子串个数
需要知道关于 SAM 的性质是,相同的子串会被去重。
所以只需要知道 SAM 上不同路径的数量就行。
所以 \(f_{u}=\sum _{v \in son} f_v+1\)
CF802I Fake News (hard)
求所有不同的子串出现次数的平方和。
首先,在 parent tree 上,所有的不同子串都能被表示(废话)
在一个状态下,这个状态能包涵的子串数量就是最小长度到最大长度的值。
最小长度不直接记录,但是它是 father 的最大长度 +1。
然后是出现次数。
一个状态下所有子串的出现次数相同,就是 endpos 的数量。endpos 的数量就是其子树下的所有的 endpos 的和。叶子节点为 \(1\)。
在建 SAM 的过程中每次最先建出的点就是 parent tree 上的叶子节点。
[TJOI2019]甲苯先生和大中锋的字符串
知道上一个题怎么做的这题就很简单了(我还没写)
正好出现 \(K\) 次就是 endpos 为 \(K\) ,然后长度数就是一个状态下的最小长度和最大长度之间的部分,这个可以差分维护数量。
未完待续。
标签:复健,子串,SAM,endpos,长度,数量 From: https://www.cnblogs.com/cc0000/p/16977194.html