Pagini recente » Istoria paginii utilizator/boyteroxana | Profil M@2Te4i | Cod sursa (job #2489568) | Cod sursa (job #1366506) | Cod sursa (job #1189966)
#include<fstream>
#include<vector>
#include<cstring>
#define A 1000100
#define B 10010
#define C 110
using namespace std;
ifstream f("ahocorasick.in");
ofstream g("ahocorasick.out");
int i,n,p,u,sol[C];
char s[A],s1[B];
struct trie{int nr;
trie *urm , *fii[26];
vector<int>v;
trie(){
nr = 0;
urm = NULL;
memset(fii,0,sizeof(fii));
}
};
trie *t = new trie,*nod,*nod2,*q[A];
inline void insereaza(trie *t , char *p , int x){
if(!*p)
{
t->v.push_back(x);
return ;
}
if(!t->fii[*p - 'a'])
{
t->fii[*p - 'a'] = new trie;
}
insereaza(t->fii[*p - 'a'] , p + 1 , x);
}
inline void BFS(){
q[p = u = 1] = t;
t->urm = t;
while(p <= u)
{
nod = q[p ++];
for(i = 0 ; i <= 25 ; ++ i)
if(nod->fii[i] != NULL)
{
for(nod2 = nod->urm ; nod2 != t && nod2 -> fii[i] == NULL ; nod2 = nod2->urm);
if(nod2->fii[i] != NULL&& nod2->fii[i] != nod->fii[i])
nod2 = nod2->fii[i];
nod->fii[i]->urm = nod2;
q[++ u] = nod->fii[i];
}
}
t->urm = t;
}
inline void AntiBFS(){
for(i = u ; i >= 2 ; -- i)
{
nod = q[i];
nod->urm->nr += nod->nr;
for(vector<int>::iterator it = nod->v.begin() ; it != nod->v.end() ; ++ it)
sol[*it] = nod->nr;
}
}
int main()
{
f >> s >> n;
for(i = 1 ; i <= n ; ++ i)
{
f >> s1 ;
insereaza(t , s1 , i);
}
BFS();
nod = t;
for(i = 0 ; s[i] ; ++ i)
{
for(; nod != t && nod->fii[s[i] - 'a'] == NULL ; nod = nod -> urm);
if(nod->fii[s[i]-'a'] != NULL)
nod = nod->fii[s[i]-'a'];
++ nod->nr;
}
AntiBFS();
for(i = 1 ; i <= n ; ++ i)
g << sol[i] << '\n';
return 0;
}