Pagini recente » Cod sursa (job #1617535) | Cod sursa (job #2582227) | Cod sursa (job #338124) | Cod sursa (job #2076970) | Cod sursa (job #931160)
Cod sursa(job #931160)
#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;
}