考查:多串匹配 AC自动机
提交:3次TLE 一次WA 203MS
第一道AC自动机题目,AC自动机(Aho-Corasick automation)是用来解决多串匹配问题的算法。而KMP的解决单串匹配的,即在给定的文本中找到搜索的关键字和它们的位置,而如果需要在一段给定的文本中同时搜索多个关键字的话就需要用到AC自动机了。
AC自动机是基于Trie实现的,首先需要建立一颗关键字的Trie树,这里需要注意的是为要搜索的关键字建树而不是文本串,在建立完树后就需要建立fail指针。假设有一个节点k,他的失败指针指向j,那么k,j满足这个性质:设root到j的距离为n,则从k之上的第n个节点到k所组成的长度为n的单词,与从root到j所组成的单词相同。还有很多问题不是很明白,不过这里还有很多很好的介绍AC自动机的文章,大家可以看看:
http://www.cppblog.com/mythit/archive/2009/04/21/80633.html
http://www.dev-club.net/xiangxixinxi/22010072906013413/201102100439240.html
http://www.cublog.cn/u3/113538/showart_2212716.html
此外还有需要注意的一点是在循环中,不要用i<strlen(text),之前TLE就是这个问题,应该是这样每次都会调用strlen函数的原因,可以直接写为text[i]。