zoukankan      html  css  js  c++  java
  • AC自动机代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    
    using namespace std;
    
    const int maxn=5e5+10;
    
    struct node
    {
        int en;
        int vis[26];
        int fail;
        node(){fail=0;en=0;for(int i=0;i<26;i++)vis[i]=0;}
    }trie[maxn];
    
    class ac
    {
        int cnt;
    public:
        ac():cnt(0){}
        void init(){cnt=0;clear();}
        void clear()
        {
            for(int i=0;i<26;i++)trie[cnt].vis[i]=0;
            trie[cnt].en=trie[cnt].fail=0;
        }
        void build(char str[])
        {
            int len=strlen(str),ch,now=0;
            for(int i=0;i<len;i++)
            {
                ch=str[i]-'a';
                if(!trie[now].vis[ch])
                {
                    trie[now].vis[ch]=++cnt;
                    clear();
                }
                now=trie[now].vis[ch];
            }
            trie[now].en++;
        }
        void get_fail()
        {
            queue<int> q;
            int u;
            for(int i=0;i<26;i++)
            {
                if(trie[0].vis[i])
                {
                    trie[trie[0].vis[i]].fail=0;
                    q.push(trie[0].vis[i]);
                }
            }
            while(!q.empty())
            {
                u=q.front();
                q.pop();
                for(int i=0;i<26;i++)
                {
                    if(trie[u].vis[i])
                    {
                        trie[trie[u].vis[i]].fail=trie[trie[u].fail].vis[i];
                        q.push(trie[u].vis[i]);
                    }
                    else
                    {
                        trie[u].vis[i]=trie[trie[u].fail].vis[i];
                    }
                }
            }
        }
        int solve(char str[])
        {
            int len=strlen(str),now=0,ch,ans=0,tmp;
            for(int i=0;i<len;i++)
            {
                ch=str[i]-'a';
                now=trie[now].vis[ch];
                tmp=now;
                while(tmp&&trie[tmp].en!=-1)
                {
                    ans+=trie[tmp].en;
                    trie[tmp].en=-1;
                    tmp=trie[tmp].fail;
                }
            }
            return ans;
        }
    };
    
    char str[2*maxn];
    ac acm;
    
    int main()
    {
        int n,t;
        scanf("%d",&t);
        while(t--)
        {
            acm.init();
            scanf("%d",&n);
            for(int i=0;i<n;i++)
            {
                scanf("%s",str);
                acm.build(str);
            }
            acm.get_fail();
            scanf("%s",str);
            printf("%d
    ",acm.solve(str));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    TSQL--NESTED LOOPS JOIN
    TSQL--SORT MERGE JOIN
    TSQL--HASH JOIN
    Backup--备份相关的信息查看及小技巧
    java后台json如何传递到jsp中解析
    大数据资源
    oracle sql生成日历表
    easyUI中onLoadSuccess方法获取多个对象
    征信用户数据分析
    JS优秀资源站点收集
  • 原文地址:https://www.cnblogs.com/wyhbadly/p/11276897.html
Copyright © 2011-2022 走看看