Cod sursa(job #1472542)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 17 august 2015 12:27:34
Problema Aho-Corasick Scor 5
Compilator c Status done
Runda Arhiva educationala Marime 1.02 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,*r,*q,*b[100],*t;
N *V() {
    N *r=(N*)malloc(sizeof(N));
    memset(r,0,sizeof(N)),memset(r->l,0,26);
    return r;
}
void A(N *r) {
	if(!(*k)) {
		b[j]=r;
     	return;
	}
	*k-='a';
	if(!r->l[*k])
     	r->l[*k]=V();
	A(r->l[*k++]);
}
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),k=a,A(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);
}