概述
AC自动机的目的是实现多模式串的匹配,即在一个主串中查询多个模式串
AC自动机是在trie(字典树)树的基础上实现的
对于一个主串,将这个各个模式串插入字典树,然后进行fail指针的生成fail指针的生成是AC自动机的关键
fail指针顾名思义就是在匹配失败时使用的,在匹配失败时下一步就是去fail指针指向的结点,避免了多次匹配造成的时间浪费
构建字典树
1 | struct NODE |
1 | void node_init(int cnt)//初始化结点 |
插入字符
1 | void insert_char(char *s) |
失配指针的计算
对于一个结点C,假设它表示的字符是a,那么他的fail指针的计算就是沿着C的父节点的fail指针走,直到找到一个结点X,X有子节点T表示的字符也是a,那么fail指针就从结点C指向X的子节点T,找不到fail就指向根节点
特别的对于直接与根节点相连的结点
该过程可以用bfs实现
代码:
1 | void cal_fail() |
查询
1 | void query() |
例题:HDU 2222
AC代码:
1 |
|