今天模拟赛,顺利过了 T1 然后发现 T2 是答辩题,T3 写了送的。
出分发现 T2 挂了,看起来是被 T2 卡哈希了,魔怔。
下午讲的题都挺好的,晚上看了 RMR,小蜜蜂乱杀,雪碧乱杀,就连 C9 都乱杀了,这才是我想象中的一线强队暴打二线队啊,不要学 Faze 和 NAVI。
子序列
这个做法比较神秘。
考虑试填,发现关键在于单个子序列会被算多次,考虑维护一下,令 \(f_i\) 表示每个字母前缀可以凑出的当前子序列个数,于是对于接下来填的字母,只需要扫一遍求出各自的个数就可以了,对于维护这个东西,发现每个字符对应一个后缀加,于是树状数组维护一下即可。
枚举字符可以使用后缀主席树查询第 \(k\) 大实现,时间复杂度 \(O(n\log n)\)。
https://marsoj.cn/record/65d301e2486aa004f124d732
斐波那契
对于询问,先找出大于 \(|T|\) 的两个串 \(A,B\),则子串只会有五种贡献:单独在 \(A\),单独在 \(B\),跨过 \(A,B\),跨过 \(B,A\),跨过 \(B,B\)。
分别使用哈希求贡献,矩阵快速幂求系数,即可做到 \(O(M+\log n)\),细节较多。
https://marsoj.cn/record/65d35a4d93e87304eede7275
串串
\(dep\) 可以认为是对应前缀的 border 数量。
考虑维护相等的字符串,建立 SAM,发现随着 \(r\) 向右移,会加入所有前缀的后缀,使他们对应的串贡献加一,同时原本的贡献也会被多算一次。
于是可以转化为 parent 树上链加链求和,使用树剖做到 \(O(n\log n)\)。
https://marsoj.cn/record/65d367f693e87304eede75bf