Pagini recente » Cod sursa (job #922538) | Cod sursa (job #93081) | Cod sursa (job #1706337) | Cod sursa (job #650445) | Cod sursa (job #1280256)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
ifstream f("ahocorasick.in");
ofstream g("ahocorasick.out");
struct trie
{ int sol,ad;
trie * fiu[28];
trie * fail;
vector <int> v;
trie()
{ for(int i=1;i<=27;i++)
fiu[i]=NULL;
sol=0;
}
};
int n,k,ap[105];
trie *el[1000005];
trie rad,*act;
char sir[1000005],s[10005];
queue <trie*> q;
void Insert(char s[10005],int ind)
{ int i,len=strlen(s),x;
act=&rad;
act->ad=0;
for(i=0;i<len;i++)
{ x=s[i]-96;
if (act->fiu[x]==NULL) act->fiu[x]=new trie;
(act->fiu[x])->ad=act->ad+1;
act=act->fiu[x];
}
act->v.push_back(ind);
}
void BFS()
{ int i=0;
trie *nod,*nod2,*fact;
act=&rad;
act->fail=act;
q.push(act);
while(!q.empty())
{ nod=q.front(); q.pop();
// cout<<nod<<" "<<i<<"\n";
k++; el[k]=nod;
for(i=1;i<=26;i++)
if (nod->fiu[i]!=NULL)
{
nod2=nod->fiu[i];
q.push(nod2);
fact=nod->fail;
while(fact->fiu[i]==NULL && fact!=&rad)
fact=fact->fail;
if (fact->fiu[i]!=NULL) fact=fact->fiu[i];
if (nod2->ad==1) fact=&rad;
// cout<<"i="<<i<<" fail="<<fact<<"\n";
nod2->fail=fact;
}
}
}
void AhoCorasick()
{ int i,x,len=strlen(sir);
act=&rad;
for(i=0;i<len;i++)
{ x=sir[i]-96;
while(act->fiu[x]==NULL && act!=&rad)
act=act->fail;
if (act->fiu[x]!=NULL) act=act->fiu[x];
act->sol++;
}
}
void RevBFS()
{ int i,j;
for(i=k;i>=1;i--)
{
for(j=0;j<el[i]->v.size();j++)
ap[el[i]->v[j]]=el[i]->sol;
(el[i]->fail)->sol+=el[i]->sol;
}
}
int main()
{ int i;
f.getline(sir,1000003);
f>>n;
for(i=1;i<=n;i++)
{
f>>s;
Insert(s,i);
}
BFS();
AhoCorasick();
RevBFS();
for(i=1;i<=n;i++)
g<<ap[i]<<"\n";
return 0;
}