Cod sursa(job #980924)

Utilizator andrettiAndretti Naiden andretti Data 5 august 2013 21:36:20
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include<stdio.h>
#include<cstring>
#include<string>
#include<vector>
#define pb push_back
#define maxn 105
#define maxm 1000005
#define maxs 10005
#define maxch 27
using namespace std;

int n,m,nrs,ql,qr;
int sol[maxn];
char t[maxm],s[maxs];

struct trie
{
    int nr;
    trie *son[maxch],*fail;
    vector <int> l;
    trie()
    {
        nr=0;
        fail=NULL;
        memset(son,NULL,sizeof(son));
    }
} *r,*q[maxn*maxs];

void insert(int number)
{
    trie *node=r;
    int ind;
    for(int i=1;i<=nrs;i++)
    {
        ind=s[i]-'a';
        if(node->son[ind]==NULL) node->son[ind]=new trie();
        node=node->son[ind];
    }
    node->l.pb(number);
}

void read()
{
    scanf("%s\n",t+1);
    m=strlen(t+1);

    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s\n",s+1);
        nrs=strlen(s+1);
        insert(i);
    }
}

void bfs()
{
    trie *k,*node;

    r->fail=r;
    for(q[++qr]=r,ql=1;ql<=qr;ql++)
    {
        k=q[ql];
        for(int i=0;i<=25;i++)
         if(k->son[i]!=NULL)
         {
             q[++qr]=k->son[i];
             if(k==r) k->son[i]->fail=r;
             else
             {
                for(node=k->fail;node!=r && node->son[i]==NULL;node=node->fail);
                k->son[i]->fail=node->son[i];
                if(node->son[i]==NULL) k->son[i]->fail=r;
            }
         }
    }
}

void bottomup_bfs()
{
    trie *node;
    for(int i=qr;i>=1;i--)
    {
        node=q[i];
        if(node!=r) node->fail->nr+=node->nr;
        for(unsigned int j=0;j<node->l.size();j++)
         sol[node->l[j]]+=node->nr;
    }
}

void aho_corasick()
{
    trie *node=r;
    int ind;
    bfs();
    for(int i=1;i<=m;i++)
    {
        ind=t[i]-'a';
        for(;node->son[ind]==NULL && node!=r;node=node->fail);
        if(node->son[ind]!=NULL) node=node->son[ind];
        node->nr++;
    }
    bottomup_bfs();
}

void print()
{
    for(int i=1;i<=n;i++)
     printf("%d\n",sol[i]);
}

int main()
{
    freopen("ahocorasick.in","r",stdin);
    freopen("ahocorasick.out","w",stdout);

    r=new trie();
    read();
    aho_corasick();
    print();

    fclose(stdin);
    fclose(stdout);
    return 0;
}