Pagini recente » Cod sursa (job #954188) | Cod sursa (job #2711198) | Cod sursa (job #2544785) | Cod sursa (job #2665581) | Cod sursa (job #661994)
Cod sursa(job #661994)
#include<cstdio>
#define I U->inf
using namespace std;
struct lst{int inf;lst *urm;lst(){inf=0;urm=0;}};
struct nod{lst *L;int A;nod *S[26],*F;nod(){L=0;A=0;for(int i=0;i<26;i++)S[i]=0;F=0;}};
nod *R,*poz[110],*Q[1000000];int n,i,b,t;char P[1000010],C[10010];void read(),solve();
int main(){read();solve();return 0;}
void read(){char *c;nod *N;lst *NL;int k;R=new nod;
freopen("ahocorasick.in","r",stdin);freopen("ahocorasick.out","w",stdout);scanf("%s",P);scanf("%d",&n);
for(i=1;i<=n;i++)
{scanf("%s",C);
for(c=C,N=R;*c;c++)
{k=*c-'a';if(!N->S[k]){N->S[k]=new nod;NL=new lst;NL->inf=k;NL->urm=N->L;N->L=NL;}N=N->S[k];}
poz[i]=N;}}
void solve(){nod *N;lst *U;char *c;R->F=R;for(U=R->L;U;U=U->urm){R->S[I]->F=R;Q[t++]=R->S[I];}
for(;b<t;b++){for(U=Q[b]->L;U;U=U->urm){for(N=Q[b]->F;;N=N->F)
{if(N->S[I]){Q[b]->S[I]->F=N->S[I];break;}if(N==R){Q[b]->S[I]->F=R;break;}}Q[t++]=Q[b]->S[I];}}
for(c=P,N=R;*c;){if(N->S[*c-'a']){N=N->S[*c-'a'];N->A++;c++;continue;}if(N==R){c++;continue;}N=N->F;}
for(t--;t>=0;t--)Q[t]->F->A+=Q[t]->A;for(i=1;i<=n;i++)printf("%d\n",poz[i]->A);}