Cod sursa(job #661994)

Utilizator proflaurianPanaete Adrian proflaurian Data 15 ianuarie 2012 17:48:22
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#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);}