其他分享
首页 > 其他分享> > 洛谷P3808 【模板】AC自动机(简单版)

洛谷P3808 【模板】AC自动机(简单版)

作者:互联网

题目链接

https://www.luogu.org/problemnew/show/P3808

AC自动机模板

代码

#include<bits/stdc++.h>
using namespace std;
#define N 1000050
int n;
char s[N];
struct AC_automation
{
    int num,idx[N],ch[N][27],Trie_num;
    int fail[N],end[N];
    void init()
        {for(int i='a';i<='z';i++)idx[i]=++num;}
    void insert(char *s)
        {
            int len=strlen(s),u=0;
            for(int i=0;i<len;i++)
            {
                int x=idx[s[i]];
                if (!ch[u][x])ch[u][x]=++Trie_num;
                u=ch[u][x];
            }
            end[u]++;
        }
    void GetFail()
        {
            queue<int>Q;
            for(int i=1;i<=num;i++)
                if (ch[0][i])Q.push(ch[0][i]);
            while(!Q.empty())
            {
                int u=Q.front();Q.pop();
                for(int i=1;i<=num;i++)
                {
                    if (ch[u][i])fail[ch[u][i]]=ch[fail[u]][i];
                    else {ch[u][i]=ch[fail[u]][i];continue;}
                    Q.push(ch[u][i]);
                }
            }
        }
    void match(char *s)
        {
            int len=strlen(s),u=0,sum=0;
            for(int i=0;i<len;i++)
            {
                int x=idx[s[i]];
                u=ch[u][x];
                for(int t=u;t&&~end[t];t=fail[t])
                    sum+=end[t],end[t]=-1;
            }
            printf("%d\n",sum);
        }
}AC;

int main()
{
#ifndef ONLINE_JUDGE
    freopen("aa.in","r",stdin);
#endif
    AC.init();
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%s",s),AC.insert(s);
    AC.GetFail();
    scanf("%s",s);
    AC.match(s);
}

标签:AC,洛谷,int,num,P3808,自动机,模板
来源: https://www.cnblogs.com/mmmqqdd/p/10852013.html