AC自动机算法学习

KMP+TRIE

int val[1000100][31],tot;
int tr[1000100];
int fail[1000100];
struct AC_Trie{
    void clean(){
        tot=0;
        memset(val,0,sizeof(val));
        memset(tr,0,sizeof(tr));
        memset(fail,0,sizeof(fail));
    }
    void build(){
        queue<int> q;
        memset(fail,0,sizeof(fail));
        while(!q.empty()) q.pop();
        for(int i=0;i<26;i++) if(val[0][i]!=0) q.push(val[0][i]);
        while(!q.empty()){
            int u=q.front();q.pop();
            for(int i=0;i<26;i++){
                if(val[u][i]!=0){
                    fail[val[u][i]]=val[fail[u]][i];
                    q.push(val[u][i]);
                }else{
                    val[u][i]=val[fail[u]][i];
                }
            }
        }
    }
    void insert(string x){
        int len=x.length(),p=0;
        for(int i=0;i<len;i++){
            int c=x[i]-'a';
            if(val[p][c]==0) tot++,val[p][c]=tot;
            p=val[p][c];
        }
        tr[p]++;
    }
    int find(string x){
        int len=x.length(),p=0,res=0;
        for(int i=0;i<len;i++){
            p=val[p][x[i]-'a'];
            for(int j=p;j&&~tr[j];j=fail[j]) res+=tr[j],tr[j]=-1;
        }
        return res;
    }
}tree;

原文地址:https://www.cnblogs.com/yzx1798106406/p/10145223.html

时间: 2024-12-16 07:53:05

AC自动机算法学习的相关文章

杭电ACM1277——全文检索~~AC自动机算法

题目的意思:给你一篇文章,再给你T个字符串,判断这T个字符串有哪些在文章中出现过. 由于文章很大,普通的方法必定超时,所以需要用 AC自动机算法. AC自动机算法是多模匹配算法之一,主要是用于在一篇文章中,找出给定的N个单词在这篇文章中出现的个数. AC自动机算法,我也是刚刚学习,主要是在建立字典树的基础上,增加了失败指针,提高了匹配的效率.而且最难的是失败指针的建立. 它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高. 对于AC自动机算法,可以参考大神的博客:点击打开链接 里面有

AC自动机算法详解

首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过.要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识.AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程.     如果你对KMP算法和了解的话,应该知道KMP算法中的next函数(shift函数或者fail函数)是干

AC自动机算法

AC自动机简介:  首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过.要搞懂AC自动机,先得有字典树Trie和KMP模式匹配算法的基础知识.KMP算法是单模式串的字符匹配算法,AC自动机是多模式串的字符匹配算法. AC自动机的构造: 1.构造一棵Trie,作为AC自动机的搜索数据结构. 2.构造fail指针,使当

浩爷AC自动机快速学习方案

    今天弄完自动机之后,从那天比赛的阴影中爬出来了,猛地一看真不咋滴难,仔细一看这尼玛还不如猛的一看...     必备算法:KMP,字典树(KMP我写了,字典树太简单,就是一个思想,我可以一个图教你做人)     先讲一下字典树:看图     好了,字典树就看酱紫一个图,你要是脑残就装不懂吧!!    下面是AC自动机的正题:     正如KMP中的求next函数是同样的一个原理     节点的属性:二十六个字母的指针,fail指针,其他...     重点:fail指针,我把它叫做同级指

AC自动机算法及模板

关于AC自动机 AC自动机:Aho-Corasickautomation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过.要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识.AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程. 简单来说,AC自动机是用来进行多模式匹配(单个主串,多个模式串)的高效算法. AC自动机的构造过程 使用Aho-

结合双数组Trie的AC自动机算法

结合双数组Trie的AC自动机算法是一种相对比较快的词匹配算法,常见于分词系统用于分词,本文准备用伪代码结合实例的形式来讲解一下该匹配算法的实现原理 构建步骤: 1.Trie树的构建 首先直观感受一下Trie树: 插入模式串 ball.bat.doll.dork.dorm.do.send.sense之后形成的trie树 trie树分三步:插入(构建).查找.删除 插入: 1.输入一个模式串 String 2.如果该模式串已经存在于树中,则跳转 8.如果不存在,跳转3 3.设置当前节点为根节点 4

转载 - AC自动机算法

出处:http://blog.csdn.net/niushuai666/article/details/7002823 AC自动机简介:  首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过.要搞懂AC自动机,先得有字典树Trie和KMP模式匹配算法的基础知识.KMP算法是单模式串的字符匹配算法,AC自动机是多模式

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类

算法模板——AC自动机

实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有时候字典会相当稀疏,所以引入了chi和bro指针进行优化——其原理比较类似于邻接表,这个东西本身和next数组本质上是一致的,只是chi和bro用于遍历某一节点下的子节点,next用于查询某节点下是否有需要的子节点) 1 type 2 point=^node; 3 node=record 4 ex: