Pagini recente » Cod sursa (job #1231996) | Cod sursa (job #2749008) | Cod sursa (job #1943972) | Cod sursa (job #1252006) | Cod sursa (job #1411179)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
#define NMAX 1000005
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
struct trie
{
int nr;
trie *back;
vector <trie *> v;
trie *f[26];
trie()
{
nr=0; back=0; v.clear();
for (int i=0;i<26;++i)
f[i]=0;
}
} *root,*aux,*a[105];
queue <trie *> q;
int n;
char A[NMAX],str[NMAX],*p;
trie *adauga(trie *r, char *s)
{
if (*s==0) return r;
if (r->f[*s-'a']==0)
r->f[*s-'a']=new trie;
return adauga(r->f[*s-'a'],s+1);
}
void bfs()
{
int i;
trie *r;
q.push(root);
while (!q.empty())
{
r=q.front(); q.pop();
for (i=0;i<26;++i)
if (r->f[i])
{
aux=r->back;
while (aux && aux!=root && aux->f[i]==0)
aux=aux->back;
if (aux==0)
aux=root;
else if (aux->f[i])
aux=aux->f[i];
r->f[i]->back=aux;
r->f[i]->back->v.push_back(r->f[i]);
q.push(r->f[i]);
}
}
}
void dfs(trie *nod)
{
for (unsigned int i=0;i<nod->v.size();++i)
{
dfs(nod->v[i]);
nod->nr+=nod->v[i]->nr;
}
}
int main()
{
int i;
root=new trie;
fin>>A>>n;
for (i=1;i<=n;++i)
{
fin>>str;
a[i]=adauga(root,str);
}
bfs();
aux=root;
for (i=0;A[i];++i)
{
while (aux!=root && aux->f[A[i]-'a']==0)
aux=aux->back;
if (aux->f[A[i]-'a']) aux=aux->f[A[i]-'a'];
aux->nr++;
}
dfs(root);
for (i=1;i<=n;++i)
fout<<a[i]->nr<<"\n";
return 0;
}