12
5
2015
0

使用AC自动机进行多模板串匹配


KMP算法可以在$\mathcal{O}\left(n+m\right)$的时间内高效地完成单个模板串的字符串匹配问题。但是对于多模板串的情况,算法的时间复杂度只有$\mathcal{O}\left(\sum\left(n+m_i\right)\right)$,就不能满足需求了。

这时可以考虑使用AC自动机。

AC自动机的思想很简单,就是用所有模板串建立一颗Trie,并通过BFS对这棵树计算失配函数,匹配时也像KMP一样沿失配边走就行了。时间复杂度降低到$\mathcal{O}\left(n+\sum m_i\right)$,和KMP一样,这也是理论时间复杂度的下界了。


下面给出代码。

构造Trie。

计算失配函数。

进行匹配。

要注意上面的代码没有考虑模板串相同的情况,实际做题时要根据题目要求进行处理。


http://acm.hdu.edu.cn/showproblem.php?pid=2222 代码

一道模板题。


http://poj.org/problem?id=2778 代码

这道是简单的应用,AC自动机可以看成是一个DFA,用矩阵快速幂计算转移方案数即可。

Category: 算法及其他知识 | Tags: 字符串 | Read Count: 565

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com