Pagini recente » Cod sursa (job #2319184) | Cod sursa (job #903815) | Cod sursa (job #2354390) | Cod sursa (job #824878) | Cod sursa (job #1815534)
#include <vector>
#include <cstring>
#include <cstdio>
#define NMAX 1000005
#define NM 10005
using namespace std;
struct ac
{
vector<int>nod;
int nr;
ac *fail,*next[26];
ac()
{
nr=0;
fail=NULL;
memset(next,0,sizeof(next));
}
}*t,*q[NM*NM],*nod;
int st,dr,n,i,sol[NM];
char sir[NMAX],s1[NM];
int isalpha(char c)
{
if(c <='z' && c>='a') return 1;
return 0;
}
void add(char *p, ac *t,int i)
{
if(!isalpha(*p))
{
t->nod.push_back(i);
return;
}
int urm=*p - 'a';
if(t->next[urm] == NULL) t->next[urm]=new ac;
add(p+1,t->next[urm],i);
}
void BFS(ac *t)
{
ac *p;
t->fail=t;
st=dr=1;
q[1]=t;
while(st <= dr)
{
nod = q[st];
for(i=0; i<26; ++i)
{
if(nod->next[i] != NULL)
{
for(p=nod->fail;p->next[i]!=NULL && p!=t; p=p->fail);
if(p->next[i] != NULL && p->next[i] != nod->next[i] ) p=p->next[i];
nod->next[i]->fail=p;
q[++dr]=nod->next[i];
}
}
++st;
}
t->fail=NULL;
}
void antibfs(ac *t)
{
for(i=dr;i>0;--i)
{
ac *p=q[i];
if(p->fail != NULL) p->fail->nr += p->nr;
for(int j=0;j < p->nod.size(); ++j)
sol[p->nod[j]] += p->nr;
}
}
int main()
{
freopen("ahocorasick.in","r",stdin);
freopen("ahocorasick.out","w",stdout);
scanf("%s",&sir);
scanf("%d",&n);
t=new ac;
for(i=1;i<=n;++i)
{
scanf("%s",&s1);
add(s1,t,i);
}
BFS(t);
int x=strlen(sir);
ac *p=t;
for(i=0;i<x;++i)
{
int urm=sir[i]-'a';
while(p->next[urm] == NULL && p!=t)
p=p->fail;
if(p->next[urm] != NULL) p=p->next[urm];
++p->nr;
}
antibfs(t);
for(i=1;i<=n;++i) printf("%d\n",sol[i]);
return 0;
}