SAM复健

关于其原理和构造啥的先不说,理解性默写就行。

对着题单开始乱水。

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\) ,然后长度数就是一个状态下的最小长度和最大长度之间的部分,这个可以差分维护数量。


未完待续。

posted @ 2022-12-12 21:39  cc0000  阅读(44)  评论(0)    收藏  举报