您的位置:首页 > 其它

【总结】字符串匹配: ac自动机

2012-04-03 00:24 190 查看
  首行用来ym hh大牛..Orz

http://www.notonlysuccess.com/index.php/aho-corasick-automaton/

--------------------------------------------------------------------------------------

模板题:

hdu2222 Keyword Search

hdu2896 病毒侵袭

hdu3065 病毒侵袭持续中(- -!)

  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的时间消耗也会相应增加.

高级运用:

+矩阵

poj2778 DNA Sequence

hdu2243 单词情结

poj1625 Censored(附带了十分恶心的高精度)

  上面的题目利用ac自动机建立一个trie图,得到图论模型(用矩阵迭代判断2点的路径数),于是

我们不用再纠结各个字符串内部有神马纠结的关系,各种图论算法可以派上用场了.

-----------------------------------------更新中---------------------------------------------------
-----------------------------------------太懒不想更新了。。。-------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: