Hungry3

梦想到达塔顶的蜗牛

hdu 2896 病毒侵袭 ac自动机

#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int max_node=60005;
const int son_num=130;
vector<int> se;
class ACAutomaton
{
    private:
    int sz;
    int trie[max_node][son_num];
    int val[max_node];
    int fail[max_node];
    public:
    void init()
    {
        sz=0;
        memset(trie,0,sizeof(trie));
        memset(val,0,sizeof(val));
    }
    int idx(char c)
    {
        return c;
    }
    void insert(char *s,int key)
    {
        int u,c,n,i;
        u=0;
        n=strlen(s);
        for(i=0;i<n;i++)
        {
            c=idx(s[i]);
            if(!trie[u][c])trie[u][c]=++sz;
            u=trie[u][c];
        }
        val[u]=key;
    }
    void query(char *T)
    {
        int u,c,n,i;
        u=0;
        n=strlen(T);
        for(i=0;i<n;i++)
        {
            c=idx(T[i]);
            u=trie[u][c];
            if(val[u])count(u);
        }
    }
    void count(int u)
    {
        if(val[u])
        {
            se.push_back(val[u]);
            count(fail[u]);
        }
    }
    void getfail()
    {
        int u,c,r,v;
        queue<int> q;
        fail[0]=0;
        for(c=0;c<son_num;c++)
        {
            u=trie[0][c];
            if(u)
            {
                fail[u]=0;
                q.push(u);
            }
        }
        while(!q.empty())
        {
            r=q.front();q.pop();
            for(c=0;c<son_num;c++)
            {
                u=trie[r][c];
                if(!u)
                {
                    trie[r][c]=trie[fail[r]][c];
                    continue;
                }
                q.push(u);
                v=fail[r];
                while(v&&!trie[v][c])v=fail[v];
                fail[u]=trie[v][c];
            }
        }
    }
}ac;
char s[210];
char T[10100];
int main()
{
    int n,i,j,tol;
    while(scanf("%d",&n)!=EOF)
    {
        ac.init();
        for(i=1;i<=n;i++)
        {
            scanf("%s",s);
            ac.insert(s,i);
        }
        ac.getfail();
        scanf("%d",&n);
        tol=0;
        for(i=1;i<=n;i++)
        {
            scanf("%s",T);
            se.clear();
            ac.query(T);

            if(se.size())
            {
                tol++;
                sort(se.begin(),se.end());
                printf("web %d:",i);
                for(j=0;j<se.size();j++)
                printf(" %d",se[j]);
                printf("\n");
            }
        }
        printf("total: %d\n",tol);
    }
}
View Code

 

posted on 2013-11-11 23:55  Hungry3  阅读(132)  评论(0)    收藏  举报

导航