AC自动机の总结

来源:互联网 发布:淘宝有发票是正品么 编辑:程序博客网 时间:2024/05/21 09:56

AC 自动机の总结

算法の简介

给一“坨”串,再给一个串,求那一“坨”串中有多少个是那个串的子串
首先我们需要知道看毛片(kmp)和trie树这俩东西

算法大概的想法是将那一坨串放到一颗trie 树里面,并且建立与看毛片相似的fail指针减少冗杂的搜索状态

建树

在trie中每一个节点都有26只儿子,每次新读入一个字符串,我们就在trie中跑一遍,遇到新的节点就把ta存进去就好了

PROCEDURE MAKETREE(X,Y:LONGINT);BEGIN    IF F[X,T[I][Y]]=0 THEN    BEGIN        INC(P);        F[X,T[I][Y]]:=P;    END;    IF Y=C[I] THEN INC(G[F[X,T[I][Y]]]) ELSE    IF Y<C[I] THEN MAKETREE(F[X,T[I][Y]],Y+1);END

其中I表示当前在对第i个字符串处理

构建失败指针

这应该系AC自动机的核心部分了,若next[i]=j ,则
设p为根到j的距离,那么树中 第i-p层到第i层与根到j的字母都是相等的
这里写图片描述
如上图,两个b分别在第二和第三层,而root–>第二层的b=s–>第三层的b(不包括s和root)那么我们就可以在搜索时直接跳过去,而不用再搜索第一层的t啦~~

搜索

搜索就很简单了,从根开始搜索,如果当前所搜索到的节点的儿子为当前字符串正在寻求匹配的字符串那就走到儿子那里,否则一直跳到next[x]处,直到有一个节点的儿子为当前正在搜索的那个节点。。。(好拗口啊不过画一下图很容易明白)~
模版题:HDOJ2222(好2啊)

0 0
原创粉丝点击