首页 > 其他 > 详细

字符串 AC自动机

时间:2019-07-06 21:07:50      阅读:128      评论:0      收藏:0      [点我收藏+]

AC自动机的板子只打了简单版。

代码如下。

#include<bits/stdc++.h>
#define sc(x) scanf("%d",&x)
using namespace std;
const int maxn=1e6+10;
int n,cnt;
struct trie{
    int fail,num;
    int ch[30];
    #define fa(x) ac[x].fail
    #define nu(x) ac[x].num
}ac[maxn];
inline void insert(string s){
    int len=s.length();
    int now=0;
    for(int i=0;i<len;i++){
        if(!ac[now].ch[s[i]-a])
            ac[now].ch[s[i]-a]=++cnt;
        now=ac[now].ch[s[i]-a];
    }
    nu(now)++;
}
//bfs
inline void getfail(){
    queue<int> q;
    for(int i=0;i<=26;i++)
        if(ac[0].ch[i])
            fa(ac[0].ch[i])=0,q.push(ac[0].ch[i]);
    while(!q.empty()){
        int now=q.front();
        q.pop();
        for(int i=0;i<26;i++){
            if(ac[now].ch[i]){
                fa(ac[now].ch[i])=ac[fa(now)].ch[i];
                q.push(ac[now].ch[i]);
            }
            else
                ac[now].ch[i]=ac[fa(now)].ch[i];
        }
    }
} 
inline int ask(string s){
    int len=s.length();
    int now=0,ans=0;
    for(int i=0;i<len;i++){
        now=ac[now].ch[s[i]-a];
        for(int j=now;j&&nu(j)!=-1;j=fa(j)){
            ans+=nu(j);
            nu(j)=-1;
        }
    }
    return ans;
}
int main()
{
    sc(n);
    string s;
    for(int i=1;i<=n;i++){
        cin>>s;
        insert(s);
    }
    fa(0)=0;
    getfail();
    cin>>s;
    printf("%d\n",ask(s));
    return 0;
}

AC自动机节点存什么信息比较重要。

各个题目都不太一样。

需要个别的分析。

具体题目见题解。

字符串 AC自动机

原文:https://www.cnblogs.com/ChrisKKK/p/11144051.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!