Pagini recente » Profil mihnea.anghel | Cod sursa (job #1177197) | Cod sursa (job #408006) | Cod sursa (job #13914) | Cod sursa (job #2001642)
#include<bits/stdc++.h>
#define Succ S[it]
using namespace std;
ifstream f("ahocorasick.in");
ofstream g("ahocorasick.out");
struct nod
{
deque<int> succ;
int A;
nod *S[26],*F;
nod()
{
succ.resize(0);
A=0;
for(int i=0; i<26; i++)S[i]=0;
F=0;
}
};
nod *R,*poz[110];
vector<nod*> Q;
int n,i,b,t;
char P[1000010],C[10010];
void read(),solve();
int main()
{
read();
solve();
return 0;
}
void read()
{
char *c;
nod *N;
int k;
R=new nod;
f>>P>>n;
for(i=1; i<=n; i++)
{
f>>C;
for(c=C,N=R; *c; c++)
{
k=*c-'a';
if(!N->S[k])
{
N->S[k]=new nod;
N->succ.push_back(k);
}
N=N->S[k];
}
poz[i]=N;
}
}
void solve()
{
nod *N;
char *c;
R->F=R;
for(auto it: R->succ)
{
R->Succ->F=R;
Q.push_back(R->Succ);
}
for(size_t i=0; i< Q.size(); i++)
{
nod *nd=Q[i];
for(auto it: nd->succ)
{
for(N=nd->F;; N=N->F)
{
if(N->Succ)
{
nd->Succ->F=N->Succ;
break;
}
if(N==R)
{
nd->Succ->F=R;
break;
}
}
Q.push_back(nd->Succ);
}
}
for(c=P,N=R; *c;)
{
if(N->S[*c-'a'])
{
N=N->S[*c-'a'];
N->A++;
c++;
continue;
}
if(N==R)
{
c++;
continue;
}
N=N->F;
}
for(; Q.size(); Q.pop_back())Q.back()->F->A+=Q.back()->A;
for(i=1; i<=n; i++)g<<(poz[i]->A)<<'\n';
}