首行用来ym hh大牛..Orz
http://www.notonlysuccess.com/index.php/aho-corasick-automaton/
--------------------------------------------------------------------------------------
模板题:
ac自动机的模板题数据貌似很弱,网上很多ac代码都不能处理各模式串之间
有后缀关系的情况,主要是query函数统计有问题,事实上每次转移都有必要查找
该状态的fail指针.如下图:
(其它指向root)
如果文本串是abcd,显然,每次转移都必须查找fail指针.
更加容易忽略的是,每次找fail都要一直找到root,否则在上面的例子中无法发现d
被匹配.之前自己错误的模板ac掉10道并不算水的题后才发现这个问题!- -!
这样做的话ac自动机的复杂度可能退化到n^2.于是想到可以利用类似线段树的懒
惰标记的东西,给node添加一个域flag,表示从该状态延fail找能否找到匹配串,如果
flag=0,就不用继续找了.flag可以在bfs造自动机时一起初始化.这个优化并不见得
很有效果,因为同样可以构造出数据使它退化成n^2,而空间消耗却增加了,每次
memset的时间消耗也会相应增加.
高级运用:
+矩阵
poj1625 Censored(附带了十分恶心的高精度)
上面的题目利用ac自动机建立一个trie图,得到图论模型(用矩阵迭代判断2点的路径数),于是
我们不用再纠结各个字符串内部有神马纠结的关系,各种图论算法可以派上用场了.
-----------------------------------------更新中---------------------------------------------------
-----------------------------------------太懒不想更新了。。。-------------------------------------