[LuoguP3808] 【模板】AC自动机(简单版)数组版

待填坑

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=1000000+1000;
struct AC_AutoMation
{
    #define root 0
    static const int sigma_size=26;
    struct node
    {
        int nxt[sigma_size],sum,fa,fail;
    }t[N*5];
    int tot;
    void Insert(char c[])
    {
        int now=root,len=strlen(c+1);
        for(int i=1;i<=len;i++)
        {
            if(t[now].nxt[c[i]-'a']==0)
                t[now].nxt[c[i]-'a']=++tot;
            now=t[now].nxt[c[i]-'a'];
        }
        t[now].sum++;
    }
    void Build()
    {
        queue <int> Q;
        for(int i=0;i<sigma_size;i++)
            if(t[root].nxt[i]!=0)
                Q.push(t[root].nxt[i]);
        while(!Q.empty())
        {
            int now=Q.front();
            Q.pop();
            for(int i=0;i<sigma_size;i++)
                if(t[now].nxt[i]!=0)
                {
                    int temp=t[now].fail;
                    while(t[temp].nxt[i]==0 and temp!=root)
                        temp=t[temp].fail;
                    t[t[now].nxt[i]].fail=t[temp].nxt[i];
                    Q.push(t[now].nxt[i]);
                }
        }
    }
    int Query(char c[])
    {
        int ans=0,len=strlen(c+1),now=root;
        for(int i=1;i<=len;i++)
        {
            int x=c[i]-'a';
            while(t[now].nxt[x]==0 and now!=root) now=t[now].fail;
            now=t[now].nxt[x];
            int temp=now;
            while(temp!=root)
            {
                if(t[temp].sum>=0)
                {
                    ans+=t[temp].sum;
                    t[temp].sum=-1;
                    temp=t[temp].fail;
                }
                else break;
            }
        }
        return ans;
    }
    #undef root
}trie;
int n;
char c[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",c+1);
        trie.Insert(c);
    }
    trie.Build();
    
    scanf("%s",c+1);
    printf("%d",trie.Query(c));
    return 0;
}
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
原文地址:https://www.cnblogs.com/GoldenPotato/p/8747017.html