AC自动机の总结

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值