Bzoj 2434
题意:见上。
先介绍 Trie,Trie图,Fail树
将字符串插入 Trie 即可得到下图
将失配函数连上,得到Trie图
Trie图可以将字符串问题转化为图论问题,具体可以看Bzoj 2938
将原边删掉,失配边反向,得到Fail树
Fail树每个点的祖先节点都是这个点失配后可以走到的点。
对于AC自动机中的每一个节点,如果节点A的失配边指向节点B,就会发现B对应的字符串一定在A对应的字符串中出现,那么在Fail树上显然可以利用这一性质。
考虑暴力,即在Fail树上往上跳。
我们还可以离线,将$y$相等的并成一块,一起处理,能过$70$分。
逆向思维,我们考虑对于每个$x$去找$y$,那么标记一下$y$能跳到的点,求子树和即可。显然可以树状数组维护DFS序。
而这样还是不能通过。我们发现每次初始化$y$能跳到的点进树状数组时,时间开销非常大。我们考虑边加边统计。
我们在原Trie树上DFS,将当前点$u$根路径上的点标记为$1$,然后再Fail树上求每个$u$对应的询问的$x$的子树和即可。