如何使用AC自动机?(详细揭秘)
教你简单地对 \(|\sum|=1e18\) 的字符串建立 ACAM
有标题党嫌疑,首先肯定离散化使得 \(|\sum|\) 与 \(n\) 同阶(虽然似乎不同阶也无所谓)
众所周知在刚刚过去的 CSP 中有一个弱智题目
我们试图用 ACAM 做掉它,首先容易发现如果我们把这两个串看成一个串,每个字符是 \(\{s_{1,i},s_{2,i}\}\) 就转化成一般的多模式串匹配问题,唯一区别在于我们需要保证匹配结点的深度,这个限制深度再跑一边然后差分轻松做
现在复杂度上限竟然在求 fail,朴素的实现是 \(O(n|\sum|)\) 的,这题的 \(|\sum|=26^2\),坠机了
事实上我们暴力跳 fail,因为一些原因复杂度也是 \(O(n)\) 的,但是这里的 \(n\) 是串的总长度而不是 trie 上的结点数,如果给出一棵 trie 就直接坠机了
注意到我们可以使用一些小技巧,直接把一个点拆成 \(k\) 层点,那么新树的叉数就是 \(log_k |\sum|\) 于比如这个题,我们取 \(k=3\) 就可以轻松做
浙公网安备 33010602011771号