Cod sursa(job #1472612)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 17 august 2015 13:46:28
Problema Aho-Corasick Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct M {
    int a;
    struct M *l[26],*x;
}N;
int i,n,j,p,u;
char e[1000001],a[10001],*k;
N *c[100000001],*s,*q,*b[100],*t,*r;
N *V() {
    N *r=(N*)malloc(sizeof(N));
    memset(r,0,sizeof(N)),memset(r->l,0,26);
    return r;
}
int main() {
    freopen("ahocorasick.in","r",stdin),freopen("ahocorasick.out","w",stdout),fgets(e,1000001,stdin),scanf("%d\n",&n),r=V();
    for(j=0;j<n;j++) {
        fgets(a,10001,stdin);
        for(k=a;*k;*k++) {
            *k-='a';
            if(!r->l[*k])
                r->l[*k]=V();
        }
        b[j]=r;
    }
    for(r->x=c[u++]=r;p<u;)
    for(t=c[p++],i=0;i<26;i++)
    if(t->l[i]) {
        for(s=t->x;s!=r&&!s->l[i];s=s->x);
        t->l[i]->x=(s->l[i]&&s->l[i]!=t->l[i]?s->l[i]:r),c[u++]=t->l[i];
    }
    for(q=r,i=0;e[i];i++) {
        for(;!q->l[e[i]-'a']&&q!=r;q=q->x);
        q=(q->l[e[i]-'a']?q->l[e[i]-'a']:q),q->a++;
    }
    for(i=u-1;i>=0;i--)
        c[i]->x->a+=c[i]->a;
    for(i=0;i<n;i++)
        printf("%d\n",b[i]->a);
}