CF163E e-Government

CF163E e-Government(AC 自动机+ BIT + dfn 序 + LCA + 序列上差分)

这么多东西搞在一起其实也没有很难。。

其实我们可以发现,题目就是让我们求每一个串作为某个串的子串出现次数之和。(好像更难理解了。)

看一下样例就知道了..

input:
1 3
a
aa
ab
?aaab

output:
6

\(6=3+2+1\) ,题意就是这个。

好,那对应到 AC 自动机上面去,就是相当于询问一个串的每个前缀对应节点,Fail 树中从这个点到根节点路径上的 \(Endpos\) 标记之和。

同时还带修,支持把某个点的 \(Endpos\) 标记减一和加一。

暴力做当然是可以的,直接树剖或者 LCT 对着链上和一顿操作即可,但是这样做很麻烦(AC 自动机套个 LCT 就显得很烦了。。虽然码量也不算特别大。)

那么根据树上差分的思想,其实我们可以把原题从:

单点修改,链上查询。

变成:子树区间修改,单点查询。

然后我们再利用序列差分变成:单点修改,子树区间查询。

具体来说就是利用序列差分,先打一下 dfn 序,然后树状数组维护这两个操作即可。

Ex(延伸)

总的来说,这道题厉害的是那个题意的转化,也就是相当于反其道而行,其实我们这里的变化(尤其是从第一步到第二步),就是一个查询和修改的变换,有时候查询好统计,修改不好改,有时候修改方便,查询却又不利,这个时候我们就要学会变通。

再比如,一道题修改某些东西,我们会先考虑怎么去维护这个修改,但实际上我们也可以考虑每次修改对答案的影响。

所以,我们要做到的就是平衡,想问题要角度多一些。

posted @ 2021-04-19 20:12  __Anchor  阅读(49)  评论(0编辑  收藏  举报