Pagini recente » Cod sursa (job #2653852) | Cod sursa (job #1835203) | Cod sursa (job #678038) | Cod sursa (job #1142544) | Cod sursa (job #661929)
Cod sursa(job #661929)
#include<cstdio>
#include<vector>
#include<deque>
using namespace std;
struct nod{int ap;nod *S[27];};
nod *root,*init(),*poz[110],*upd(nod*,char*);
deque<nod*> Q;
int n,i,Ap;
char P[1000010],C[10010];
void read(),fail(),load(nod*,char*),DF(nod*);
int main()
{
read();fail();load(root,P);DF(root);
for(i=1;i<=n;i++)
printf("%d ",poz[i]->ap);
return 0;
}
void read()
{
freopen("ahocorasick.in","r",stdin);
freopen("ahocorasick.out","w",stdout);
scanf("%s",P);
scanf("%d",&n);
root=init();
for(i=1;i<=n;i++)
{
scanf("%s",C);
poz[i]=upd(root,C);
}
}
nod *upd(nod *N,char *c)
{
if(!*c)return N;
if(!N->S[*c-'a'])N->S[*c-'a']=init();
return upd(N->S[*c-'a'],c+1);
}
nod *init()
{
nod *aux=new nod;
aux->ap=0;
for(int i=0;i<27;i++)aux->S[i]=0;
return aux;
}
void fail()
{
nod *aux,*faux;
for(i=0;i<26;i++)if(root->S[i]){root->S[i]->S[26]=root;Q.push_back(root->S[i]);}
for(;Q.size();)
{
root->S[26]=root;
aux=Q.front();Q.pop_front();
for(i=0;i<26;i++)if(aux->S[i])
{
for(faux=aux->S[26];;faux=faux->S[26])
{
if(faux->S[i]){aux->S[i]->S[26]=faux->S[i];break;}
if(faux==root){aux->S[i]->S[26]=root; break;}
}
Q.push_back(aux->S[i]);
}
}
}
void load(nod *N, char *c)
{
if(!*c)return;
while(!N->S[*c-'a'])N=N->S[26];
N->S[*c-'a']->ap++;
load(N->S[*c-'a'],c+1);
}
void DF(nod *N)
{
for(int i=0;i<26;i++)
if(N->S[i])
DF(N->S[i]);
N->S[26]->ap+=N->ap;
}