Cod sursa(job #931160)

Utilizator taigi100Cazacu Robert taigi100 Data 28 martie 2013 00:24:39
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<vector>

#define maxlen 1000005
#define maxop 10005
#define ds 26

using namespace std;

int lenght,n,l,final[maxop],startq,endq;
char text[maxlen],aux[maxop];

struct ac
{
	vector<int> nd;
	int nrp;
	ac *f[ds],*fail;
	ac() {
		nrp=0;
		fail=NULL;
		memset(f,0,sizeof(f));
	}
} *q[maxop*maxop],*t,*p;

void ins(ac *t,char *txt,int i)
{
	if( !isalpha(*txt))
	{
		t->nd.push_back(i);
		return;
	}
	int val = *txt-'a';
	if(t->f[val]==0)
		t->f[val]=new ac;
	ins(t->f[val],txt+1,i);
}

void bfs(ac *t)
{
	ac *fuckyou;
	t->fail=t;
	for(q[startq=endq=1]=t;startq<=endq;++startq)
	{
		ac *fr=q[startq];
		for(int i=0;i<ds;++i) 
			if( fr->f[i]!=NULL )
			{
				for(fuckyou=fr->fail;
					fuckyou!=t && fuckyou->f[i]==NULL ; 
					fuckyou=fuckyou->fail);
				if(fuckyou->f[i]!=NULL && fuckyou->f[i]!=fr->f[i]) fuckyou=fuckyou->f[i];
				fr->f[i]->fail=fuckyou;
				q[++endq]=fr->f[i];
			}
	}
	t->fail=NULL;
}

void antibfs(ac *t)
{
	for(int i=endq;i>0;i--)
	{
		ac *fr=q[i];
		if(fr->fail!=NULL) fr->fail->nrp+=fr->nrp;
		for(int j=0;j<fr->nd.size();j++)
			final[fr->nd[j]]=fr->nrp;
	}
}
int main()
{
	freopen("ahocorasick.in","r",stdin);
	freopen("ahocorasick.out","w",stdout);

	t=new ac;

	scanf("%s%d",text,&n);
	lenght=strlen(text);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",aux);
		ins(t,aux,i);
	}

	bfs(t);

	p=t;
	for(int i=0;i<lenght;i++)
	{
		int next=text[i]-'a';
		for(;p->f[next]==NULL && p!=t ;  p= p->fail);
		if(p->f[next]!=NULL) p=p->f[next];
		++p->nrp;
	}
	antibfs(t);

	for(int i=1;i<=n;i++) printf("%d\n",final[i]);
	return 0;
}