这是一个英文版的讲的比较好的AC自动机资料。

http://www.cs.uku.fi/~kilpelai/BSA05/lectures/slides04.pdf

如果不爱看英文,可以看我整理的大致的翻译,再加上点解释说明啥的,建议中英两个版本结合着看,毕竟我翻译的里面可能有些错误。

http://download.csdn.net/download/morgan_xww/4476863

可以预览一下文档中的截图:

我的模板:

class ACAutomaton
{
public:static const int MAX_N = 10000 * 50 + 5;//最大结点数:模式串个数 X 模式串最大长度static const int CLD_NUM = 26;//从每个结点出发的最多边数,字符集Σ的大小,一般是26个字母int n;                          //trie树当前结点总数int id['z'+1];                  //字母x对应的结点编号为id[x]int fail[MAX_N];                //fail指针int tag[MAX_N];                 //根据题目而不同int trie[MAX_N][CLD_NUM];       //trie树,也就是goto函数void init(){for (int i = 0; i < CLD_NUM; i++)id['a'+i] = i;}void reset(){memset(trie[0], -1, sizeof(trie[0]));tag[0] = 0;n = 1;}//插入模式串s,构造单词树(keyword tree)void add(char *s){int p = 0;while (*s){int i = id[*s];if ( -1 == trie[p][i] ){memset(trie[n], -1, sizeof(trie[n]));tag[n] = 0;trie[p][i] = n++;}p = trie[p][i];s++;}tag[p]++;         //因题而异}//构造AC自动机,用BFS来计算每个结点的fail指针,就是构造trie图void construct(){queue<int> Q;fail[0] = 0;for (int i = 0; i < CLD_NUM; i++){if (-1 != trie[0][i]){fail[trie[0][i]] = 0; //root下的第一层结点的fail指针都指向rootQ.push(trie[0][i]);}else{trie[0][i] = 0;    //这是阶段一中的第2步}}while ( !Q.empty() ){int u = Q.front();Q.pop();for (int i = 0; i < CLD_NUM; i++){int &v = trie[u][i];if ( -1 != v ){Q.push(v);fail[v] = trie[fail[u]][i];tag[u] += tag[fail[u]];     //因题而异,某些题目中不需要这句话}else{            //当trie[u][i]==-1时,设置其为trie[fail[u]][i],就构造了trie图v = trie[fail[u]][i];}}}}//因题而异//在目标串t中匹配模式串int solve(char *t){int q = 0, ret = 0;while ( *t ){q = trie[q][id[*t]];int u = q;while ( u != 0 ){ret += tag[u];tag[u] = 0;u = fail[u];}t++;}return ret;}
} ac;

AC自动机——Aho-Corasick Automaton相关推荐

  1. TypeScript:Aho–Corasick算法实现敏感词过滤

    敏感词过滤应该是许多后端同事经常会遇到的需求,无论是评论.弹幕.文章,都需要做敏感词过滤处理来规避风险.在前端开发中,使用replace函数来替换字符串是我们的常规操作,在这之前我思考过如果用Java ...

  2. 【学习笔记+习题集】字符相关(输入输出流,字典树,AC自动机,后缀自动机)(4598字)(更新至2022.12.28)

    目录 板块零:输入输出流 情况一:读取字符串和读取行混用的时候 情况二:关于识别空行 第一题:hdoj2072 情况三:用char数组接受getline函数的输入流 情况四:关于汉字 补充练习: 第一 ...

  3. 字符串处理【AC自动机】 - 原理 AC自动机详解

    字符串处理[AC自动机] - 原理 AC自动机详解 AC自动机(Aho-Corasick automaton)在1975年产生于贝尔实验室,是著名的多模匹配算法. 学习AC自动机,要有KMP和Trie ...

  4. Python实现多模匹配——AC自动机

    Python实现多模匹配--AC自动机 目标:学习AC自动机,多模匹配. 要求:尽可能用纯Python实现,提升代码的扩展性. 一.什么是AC自动机? AC自动机,Aho-Corasick autom ...

  5. 字符串-AC自动机(详细图解)

    文章目录 AC自动机 原理 模板 例题 HDU-2222Keywords Search HDU-2896病毒侵袭 HDU-3065病毒侵袭持续中 POJ-2778DNA Sequence HDU-22 ...

  6. ac自动机 匹配最长前缀_Aho Corasick自动机结合DoubleArrayTrie极速多模式匹配

    本文使用Double Array Trie实现了一个性能极高的Aho Corasick自动机,应用于分词可以取得1400万字每秒,约合27MB/s的分词速度.其中词典为150万词,构建耗时1801 m ...

  7. 浅谈Aho-Corasick automaton(AC自动机)

    Aho-Corasick automaton是什么? 要学会AC自动机,我们必须知道什么是Trie,也就是字典树.Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统 ...

  8. Aho-Corasick automaton,ac自动机实现

    文章目录 写在前面 算法概述 trie树的构建 trie树的节点结构 插入P串到trie树中 fail指针的创建 搜索过程 测试程序 写在前面 原作者的视频讲解链接:[算法]轻松掌握ac自动机_哔哩哔 ...

  9. Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现

    多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...

最新文章

  1. oracle查找异常中断的sql,oracle查询sql报错SqlExceptionHelper:131 ORA-00933: SQL command not properly ended...
  2. arm b bl 地址无关码_32位和64位下的arm_pwn初探
  3. Cubic interpolation立方插值
  4. 判断当前用户有无Administrator的权限
  5. Java系统属性/环境变量
  6. java房屋租赁系统源码,基于jsp+mysql+Spring开发,免费分享
  7. 聚合支付系统设计(一)
  8. TrinityCore魔兽世界服务器-环境搭建(Debian11)
  9. 【IoT】产品设计之思维模型:四种知识结构
  10. 抖音账号和视频都没有问题,为什么我的流量还是不好?丨国仁网络资讯
  11. Spark SQL_JZZ158_MBY
  12. win10清理_win10系统垃圾清理方法教程
  13. 自称菜鸟的二本大龄程序员居然拿到百度offer,还有嘉实offer(百度三面面经)
  14. DIH增量、定时导入并检索数据--转载
  15. 家庭观念算老几?(转)
  16. 前端装逼技巧 108 式(一)—— 打工人
  17. Unity 中实现子弹时间效果
  18. 2019年web前端学习路线图大纲及学习方法,哎呦不错哦
  19. 品牌商自述:为什么同样的商品,拼多多会更便宜?
  20. 基于Altium Designer 20设计双层印刷电路板的详细步骤(待写)

热门文章

  1. 黑盒测试——等价类划分
  2. 由浅入深,48条JavaScript知识点总结
  3. 【分享汇总】25个主题分享,360°领略OpenHarmony最新技术版图
  4. Linux文件和文件夹复制命令
  5. zencart刷淘宝信誉 被骗了 多情自古空余恨
  6. Qt自绘控件之扇形统计图
  7. Javascript数据类型强制转换
  8. Python之字符串
  9. 二、IDEA创建Maven项目
  10. mac php开发套件_mac php集成开发环境搭建软件推荐(附教程)