Pagini recente » Cod sursa (job #2456214) | Cod sursa (job #2496077) | Cod sursa (job #792087)
Cod sursa(job #792087)
#include <cstdio>
#include <fstream>
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
#include <string>
using namespace std;
#define pb push_back
struct trie {
int vl;
trie *nxt,*f[26];
vector<trie*> V;
trie (){
vl=0;
nxt=0;
memset(f,0,sizeof(f));
}
};
trie *T=new trie;
trie *w[105];
int n;
string A,B;
inline trie* add (trie *nw,int is)
{
if(is==B.size())
return nw;
if(nw->f[B[is]-'a']==0)
nw->f[B[is]-'a']=new trie;
return add(nw->f[B[is]-'a'],is+1);
}
void read ()
{
ifstream in ("ahocorasick.in");
in>>A>>n;
for(int i=1;i<=n;++i)
{
in>>B;
w[i]=add(T,0);
}
}
void BFS ()
{
queue<trie*> q;
for(q.push(T);q.size();q.pop())
{
trie *nw=q.front();
for(int i=0;i<26;++i)
if(nw->f[i])
{
trie *a;
for(a=nw->nxt;a&&a->f[i]==0;a=a->nxt);
if(a)
{
nw->f[i]->nxt=a->f[i];
a->f[i]->V.pb(nw->f[i]);
}
else
{
nw->f[i]->nxt=T;
T->V.pb(nw->f[i]);
}
q.push(nw->f[i]);
}
}
}
void solve ()
{
trie *nw=T;
for(size_t i=0;i<A.size();++i)
{
for(;nw&&nw->f[A[i]-'a']==0;nw=nw->nxt);
if(!nw)
nw=T;
else
{
nw=nw->f[A[i]-'a'];
++nw->vl;
}
}
}
inline void DFS (trie *nw)
{
for(vector<trie*>::iterator it=nw->V.begin();it<nw->V.end();++it)
{
DFS(*it);
nw->vl+=(*it)->vl;
}
}
void out ()
{
freopen ("ahocorasick.out","w",stdout);
for(int i=1;i<=n;++i)
printf("%d\n",w[i]->vl);
}
int main ()
{
read ();
BFS ();
solve ();
DFS(T);
out ();
return 0;
}