Cod sursa(job #661929)

Utilizator proflaurianPanaete Adrian proflaurian Data 15 ianuarie 2012 15:57:20
Problema Aho-Corasick Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<cstdio>
#include<vector>
#include<deque>
using namespace std;
struct nod{int ap;nod *S[27];};
nod *root,*init(),*poz[110],*upd(nod*,char*);
deque<nod*> Q;
int n,i,Ap;
char P[1000010],C[10010];
void read(),fail(),load(nod*,char*),DF(nod*);
int main()
{
    read();fail();load(root,P);DF(root);
    for(i=1;i<=n;i++)
          printf("%d ",poz[i]->ap);
    return 0;
}
void read()
{
    freopen("ahocorasick.in","r",stdin);
    freopen("ahocorasick.out","w",stdout);
    scanf("%s",P);
    scanf("%d",&n);
    root=init();
    for(i=1;i<=n;i++)
    {
        scanf("%s",C);
        poz[i]=upd(root,C);
    }

}
nod *upd(nod *N,char *c)
{
    if(!*c)return N;
    if(!N->S[*c-'a'])N->S[*c-'a']=init();
    return upd(N->S[*c-'a'],c+1);
}
nod *init()
{
    nod *aux=new nod;
    aux->ap=0;
    for(int i=0;i<27;i++)aux->S[i]=0;
    return aux;
}
void fail()
{
    nod *aux,*faux;
    for(i=0;i<26;i++)if(root->S[i]){root->S[i]->S[26]=root;Q.push_back(root->S[i]);}
    for(;Q.size();)
    {
        root->S[26]=root;
        aux=Q.front();Q.pop_front();
        for(i=0;i<26;i++)if(aux->S[i])
        {
            for(faux=aux->S[26];;faux=faux->S[26])
            {
                if(faux->S[i]){aux->S[i]->S[26]=faux->S[i];break;}
                if(faux==root){aux->S[i]->S[26]=root;      break;}
            }
            Q.push_back(aux->S[i]);
        }
    }
}
void load(nod *N, char *c)
{
    if(!*c)return;
    while(!N->S[*c-'a'])N=N->S[26];
    N->S[*c-'a']->ap++;
    load(N->S[*c-'a'],c+1);
}
void DF(nod *N)
{
    for(int i=0;i<26;i++)
        if(N->S[i])
            DF(N->S[i]);
    N->S[26]->ap+=N->ap;
}