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

Posted GoldenPotato的OI世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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;
}

 

以上是关于[LuoguP3808] 模板AC自动机(简单版)数组版的主要内容,如果未能解决你的问题,请参考以下文章

luogu P3808 模板AC自动机(简单版)

P3808 模板AC自动机(简单版)

[模板][P3808]AC自动机(简单版)

P3808 模板AC自动机(简单版)

[模板]洛谷T3808 AC自动机(简单版)

P3808 模板AC自动机(简单版)