Pagini recente » Cod sursa (job #2108826) | Cod sursa (job #384419) | Istoria paginii runda/winners100 | Cod sursa (job #2218527) | Cod sursa (job #1221396)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
#define NMAX 1000005
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
struct trie
{
int sol;
trie *f[26];
trie *back;
vector <trie *> v;
trie()
{
sol=0;
back=0;
for (int i=0;i<26;++i)
f[i]=0;
}
} *root,*x,*aux,*w[10005];
queue <trie *> q;
char s[10005],A[NMAX];
int n;
trie *adauga(trie *r, char *s)
{
if (*s==0)
return r;
if (r->f[*s-'a']==NULL)
r->f[*s-'a']=new trie;
return adauga(r->f[*s-'a'],s+1);
}
int dfs(trie *nod)
{
int i;
for (i=0;i<nod->v.size();++i)
nod->sol+=dfs(nod->v[i]);
return nod->sol;
}
int main()
{
int i;
fin>>A>>n;
root=new trie;
for (i=1;i<=n;++i)
{
fin>>s;
w[i]=adauga(root,s);
}
q.push(root);
while (!q.empty())
{
x=q.front(); q.pop();
for (i=0;i<26;++i)
if (x->f[i])
{
aux=x->back;
while (aux && aux->f[i]==NULL)
aux=aux->back;
if (aux==0)
x->f[i]->back=root;
else
x->f[i]->back=aux->f[i];
x->f[i]->back->v.push_back(x->f[i]);
q.push(x->f[i]);
}
}
aux=root;
for (i=0;A[i];++i)
{
while (aux!=root && aux->f[A[i]-'a']==NULL)
aux=aux->back;
if (aux->f[A[i]-'a'])
aux=aux->f[A[i]-'a'];
aux->sol++;
}
dfs(root);
for (i=1;i<=n;++i)
fout<<w[i]->sol<<"\n";
return 0;
}