• [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;
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    十二、 Spring Boot 静态资源处理
    九、 Spring Boot 拦截器
    docker之搭建私有仓库
    docker之Dokcerfile 常用指令
    docker之网络管理
    docker之故障问题解决方案
    docker之搭建LNMP
    docker之容器数据持久化
    都说岁月不饶人,我们又何曾饶过岁月
    docker之容器管理
  • 原文地址:https://www.cnblogs.com/GoldenPotato/p/8747017.html
Copyright © 2020-2023  润新知