美文网首页
AC自动机

AC自动机

作者: fo0Old | 来源:发表于2017-04-14 14:28 被阅读0次
struct AhoCorasickAutomaton
{
    static const int alp=26;

    static int to_idx(char ch)
    {
        return ch-'a'+1;
    }

    struct Trie
    {
        static const int __=1000005;
        struct node
        {
            int nex[alp+1],last,num;
            bool add[alp+1];
            void clear()
            {
                num=last=0;
                mem(nex,0);
                mem(add,false);
            }
        }t[__];

        Trie() {clear();}

        node& operator[](int x){return t[x];}

        int idx;

        void insert(char s[],int len)
        {
            int x=0;
            for(int i=1;i<=len;++i)
            {
                int k=to_idx(s[i]);
                if(!t[x].nex[k])
                {
                    t[x].nex[k]=++idx;
                    t[idx].clear();
                }
                x=t[x].nex[k];
            }
            //标记结尾
        }

        void clear(){idx=0;t[0].clear();}
    }t;

    AhoCorasickAutomaton() {clear();}

#define nex(x) t[x].nex[i]
#define fail(x) t[x].nex[0]

    void get_fail()
    {
        queue<int>Q;Q.push(0);
        while(!Q.empty())
        {
            int x=Q.front();Q.pop();
            for(int i=1;i<=alp;++i)
                if(nex(x))
                {
                    Q.push(nex(x));
//                    for(int y=x;y;y=fail(y))
//                        if(nex(fail(y)))
//                        {
//                            fail(nex(x))=nex(fail(y));
//                            break;
//                        }
                    if(x)fail(nex(x))=nex(fail(x));
                }
                else
                {
                    nex(x)=nex(fail(x));
                    t[x].add[i]=true;
                }
            if(t[fail(x)].num)t[x].last=fail(x);
            else t[x].last=t[fail(x)].last;

        }
    }

    int ac(char s[],int len)
    {
        int ans=0;
        for(int i=1,x=0;i<=len;++i)
        {
            int k=to_idx(s[i]);
//            while(x && !t[x].nex[k])x=fail(x);
            x=t[x].nex[k];
            for(int y=x;y;y=t[y].last)
                ;//统计答案
        }
        return ans;
    }

    void debug()
    {
        for(int i=0;i<=t.idx;++i)
        {
            pf("t[%d]: fail:%d last:%d\n",i,fail(i),t[i].last);
            for(int j=1;j<=26;++j)
                if(t[i].nex[j])
                    printf("%d(%c) ",t[i].nex[j],j-1+'a');
            puts("\n");
        }
    }

    void clear(){t.clear();}
}aca;

相关文章

  • AC自动机 专题整理

    AC自动机学习记录 参考资料 字典树(讲解+模版)AC自动机算法AC自动机算法详解hdu 2222 ac自动机入门...

  • 自动AC机?不,是AC自动机

    今天我们来介绍一点进阶的知识——AC自动机。 AC自动机是啥 AC自动机是什么呢?是不是用了这个算法,不管什么题目...

  • 【AC自动机】AC自动机可以帮你自动AC吗

    参考博文:AC自动机算法详解 (转载) (原文作者:DarkRaven,原文的链接失效了)图片来源:AC自动机算...

  • AC自动机-去除敏感字符

    AC自动机 AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名...

  • lucene中文分词

    IK中文分词 DoubleArrayTrie的AC自动机

  • 字符串算法小结

    hash kmp和ac自动机 后缀数组,后缀自动机,后缀树 扩展kmp manacher算法 回文自动机 可删改的...

  • AC 自动机

    AC自动机 AC自动机是一个经典的多模式串匹配算法,它可以实现对主串的一次扫描来匹配多个模式串的功能。实现AC自动...

  • 回文树(附模板题URAL-1960)

    (最好事先学习过kmp,Trie,AC自动机)回文树,有效解决各类回文问题的超级666的树形结构 集AC自动机的f...

  • AC自动机_模板

    AC自动机: 求多个字符串是否在主串中出现过。可依据情况分别求出出现次数,出现位置等。 AC自动机入门Keywor...

  • AC自动机

    参考资料:AC自动机GIF动图(来自油管) 以下文章节选自:王争老师 AC自动机:如何用多模式串匹配实现敏感词过滤...

网友评论

      本文标题:AC自动机

      本文链接:https://www.haomeiwen.com/subject/rvbvattx.html