Pagini recente » Cod sursa (job #998017) | Cod sursa (job #198873) | Cod sursa (job #3191800) | Cod sursa (job #3219450) | Cod sursa (job #980989)
Cod sursa(job #980989)
#include<fstream>
#include<cstring>
#include<vector>
using namespace std;
ifstream f("ahocorasick.in");
ofstream g("ahocorasick.out");
int i,p,n;
char s[1000010],s1[10100];
struct trie{
trie *fii[26],*fiu;
int v;
trie(){
fiu=0;
memset(fii,0,sizeof(fii));
v=0;
}
};
vector<trie *>q;
trie *t,*sol[110];
inline trie * insereaza(trie *t,char *p)
{
if(!*p)
return t;
if(!t->fii[*p-'a'])
t->fii[*p-'a']=new trie;
return insereaza(t->fii[*p-'a'],p+1);
}
int main()
{
f>>s>>n;
t=new trie;
for(i=1;i<=n;++i)
{
f>>s1;
sol[i]=insereaza(t,s1);
}
trie *t1,*t2;
q.push_back(t);
for(p=0;p<q.size();++p)
{
t1=q[p];
for(i=0;i<=25;++i)
if(t1->fii[i])
{
for(t2=t1->fiu;t2&&!t2->fii[i];t2=t2->fiu);
if(t2)
t1->fii[i]->fiu=t2->fii[i];
else
t1->fii[i]->fiu=t;
q.push_back(t1->fii[i]);
}
}
t1=t;
for(i=0;s[i];++i)
{
while(t1&&!t1->fii[s[i]-'a'])
t1=t1->fiu;
if(!t1)
{
t1=t;
}
else
{
t1=t1->fii[s[i]-'a'];
++t1->v;
}
}
for(i=q.size()-1;i>=0;--i)
{
if(q[i]->fiu)
q[i]->fiu->v+=q[i]->v;
}
for(i=1;i<=n;++i)
g<<sol[i]->v<<'\n';
return 0;
}