Cod sursa(job #1478048)

Utilizator SilviuIIon Silviu SilviuI Data 27 august 2015 17:39:05
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
/*Aho-corasick*/
#include <stdio.h>
#include <cstring>
#include <vector>
#define nmax 1000010
#define pmax 10010
using namespace std;
struct trie { vector <int> y; int x; trie *t[26],*fail;
       trie () {
           x=0; fail=NULL;
           for (int i=0;i<26;i++) t[i]=NULL;
       }
};
int i,n,pr,ul,m,sol[110];
char s[nmax],ss[pmax];
trie *root,*q[nmax],*a;
void add_intrie(int x)
{
    int i=1,m=strlen(ss+1); trie* a=root;
    while (i<=m && a->t[ss[i]-97]!=NULL) a=a->t[ss[i]-97],i++;
    for (;i<=m;i++) {
        a->t[ss[i]-97]=new trie; a=a->t[ss[i]-97];
    }
    a->y.push_back(x);
}
void bfs(trie* a)
{
    trie* dolar;
    a->fail=a; pr=1; ul=1; q[pr]=a;
    for (;pr<=ul;pr++) {
        trie *fr=q[pr];
        for (int i=0;i<26;i++)
        if (fr->t[i]!=NULL) {
            for (dolar=fr->fail;dolar!=a && dolar->t[i]==NULL;dolar=dolar->fail);
            if (dolar->t[i]!=NULL && dolar->t[i]!=fr->t[i]) dolar=dolar->t[i];
            fr->t[i]->fail=dolar;
            ul++; q[ul]=fr->t[i];
        }
    }
    a->fail=NULL;
}
void antibfs(trie *a)
{
    for (int i=ul;i>0;i--) {
        trie *fr=q[i];
        if (fr->fail!=NULL) fr->fail->x+=fr->x;
        for (int j=0;j<fr->y.size();j++) sol[fr->y[j]]=fr->x;
    }
}
int main() {
freopen("ahocorasick.in","r",stdin);
freopen("ahocorasick.out","w",stdout);
gets(s+1); root=new trie;
scanf("%d",&n); gets(ss);
for (i=1;i<=n;i++) {
    gets(ss+1); add_intrie(i);
}
bfs(root); a=root; m=strlen(s+1);
for (i=1;i<=m;i++) {
    for (;a->t[s[i]-97]==NULL && a!=root;a=a->fail);
    if (a->t[s[i]-97]!=NULL) a=a->t[s[i]-97];
    a->x++;
}
antibfs(root);
for (i=1;i<=n;i++) printf("%d\n",sol[i]);
return 0;
}