zoukankan      html  css  js  c++  java
  • hdu-2222

    AC自动机(模板题)

    #include<bits/stdc++.h>
    #define _for(i,a,b) for(int i=a;i<=b;i++)
    using namespace std;
    typedef long long ll;
    const int mod =1e6+7;
    double esp=1e-6;
    int INF =0x3f3f3f3f;
    const int inf = 1<<28;
    const int MAXN=1e5+5;
    int trie[MAXN*5][27];
    int cntword[MAXN*5];
    int fail[MAXN*5];
    int cnt=0;
    void insertWord(string s)
    {
        int u=0;
        for(int i=0;i<s.size();i++)
        {
            int v=s[i]-'a';
            if(trie[u][v]==0)
            {
                trie[u][v]=++cnt;
            }
            u=trie[u][v];
        }
        cntword[u]++;
    }
    void getfail()
    {
        queue<int> q;
        for(int i=0;i<26;i++)
        {
            if(trie[0][i])
            {
                fail[trie[0][i]]=0;
                q.push(trie[0][i]);
            }
        }
        while(!q.empty())
        {
            int now=q.front();
            q.pop();
            for(int i=0;i<26;i++)
            {
                if(trie[now][i])
                {
                    fail[trie[now][i]]=trie[fail[now]][i];
                    q.push(trie[now][i]);
                }
                else
                {
                    trie[now][i]=trie[fail[now]][i];
                }
            }
        }
    }
    int query(string s)
    {
        int now=0,ans=0;
        for(int i=0;i<s.size();i++)
        {
            now=trie[now][s[i]-'a'];
            for(int j=now;j&&cntword[j]!=-1;j=fail[j])
            {
                ans+=cntword[j];
                cntword[j]=-1;
            }
        }
        return ans;
    }
    int main()
    {
        int n,t;
        scanf("%d",&t);
        while(t--)
        {
            string s;
            memset(trie,0,sizeof(trie));
            memset(cntword,0,sizeof(cntword));
            memset(fail,0,sizeof(fail));
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
            {
                cin>>s;
                insertWord(s);
            }
            fail[0]=0;
            getfail();
            cin>>s;
            printf("%d
    ",query(s));
        }
        return 0;
    }
  • 相关阅读:
    PDIUSBD12指令
    (转)USB的VID和PID,以及分类(Class,SubClass,Protocol)
    静态测试
    一种循环buffer结构
    RL78 芯片复位指令
    XModem协议
    位反转的最佳算法
    CCP 协议
    AUTOSAR 架构
    HEX 文件格式
  • 原文地址:https://www.cnblogs.com/kayiko/p/12303799.html
Copyright © 2011-2022 走看看