AC自动机.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
AC自动机

AC自动机 --周煜焜 AC自动机 Aho-Corasick automaton,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。 要学会AC自动机,我们必须知道什么是Trie,也就是字典树。Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 ----摘自百度百科 重点来了 AC自动机不是 Accept自动机 由刚才百度百科可知 AC自动其实是Trie树构建的构成的DAG(有向无环图) AC自动机是DFA(有穷状态自动机) 所以状态转移也是其精髓所在(等学完矩阵连乘可以体会一下 poj 2778等) 由其构造方法可知算法是O(n)时间的多模式串匹配 Trie树 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系 统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 ----摘自 百度百科 Trie简介 Trie树是一个CH叉树,CH是字符集大小 构造Trie树 示例代码(trie.cpp) Trie树节点 struct node { node *go[CH]; int val[CH]; }; 当然也可以用数组模拟: int ch[NODE_MAX][CH],val[NODE_MAX]; int sz; 举个栗子! 假设以串: he she his hers 构造Trie树 可以得到下图 请先假设这个图上只有那个根节点好不好 - - 插入he 插入he 插入he 插入其他串(最终形态!) hdu 1671 hdu 1075 hdu 1251 hdu 1247 AC自动机 最原始的AC自动机就是加入了类似KMP next数组 的失配指针 失配指针指向另一个点成为一个新的边 其实求失配指针的方法很多(窝见过的就有三四种 - -||) 示例代码(DFA.cpp)用的是《刘汝佳的算法竞赛入门经典训练指南》上的最简单的方法 为了熟悉失配指针的匹配 可以按照代码把失配指针画出来 while(rear!=front) { int cur = *front++; for(int c=0;cCH;c++) { int u=ch[cur][c]; int fail=f[cur]; if(u) { while(fail !ch[fail][c]) fail = f[fail]; f[u]=ch[fail][c]; last[u]=val[f[u]]?f[u]:last[f[u]]; *rear++=u; } } } 注: last[]: 因为同一个节点可能对应多个单词结尾 所以我们需要沿着失配边往回走 为了提高效率 这里增设一个指针last[] 它指向失配时遇到的下一个单词节点 hdu 2222 hdu 2896 hdu 3065 zoj 3228 * * 有了 ↓ ch[0][h]=1 有了 ↓ ch[0][h]=1 ch[1][e]=2 有了 ↓ ch[0][h]=1 val[2]=1 ch[1][e]=2 ch[0][h]=1 val[2]=1 ch[1][e]=2 ch[3][h]=4 ch[0][s]=3 ch[4][e]=5 val[5]=2 ch[1][i]=6 ch[6][s]=7 val[7]=3 ch[2][r]=8 val[9]=4 ch[8][s]=9 * *

文档评论(0)

liudao + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档