Pagini recente » Cod sursa (job #310688) | Cod sursa (job #313583) | Cod sursa (job #314293) | Cod sursa (job #3252195) | Cod sursa (job #1222187)
#include <fstream>
#include <vector>
#include <queue>
#define DIM1 1000011
#define DIM2 10011
using namespace std;
ifstream f("ahocorasick.in");
ofstream g("ahocorasick.out");
int n;
struct trie{
int sol;
trie *p[26],*ret;
vector<trie *> v;
trie(){
ret=0,sol=0;
v.clear();
for(int i=0;i<26;i++) p[i]=0;
}
};
trie *root,*w[101],*nod,*aux;
char S[DIM1],a[DIM2],*P;
queue<trie *> Q;
trie *update(trie *r,char *s){
#define fiu p[*s-'a']
if(*s){
if(r->fiu==NULL)
r->fiu=new trie;
return update(r->fiu,s+1);
}
else
return r;
}
void dfs(trie *nod){
for(register int i=0;i<nod->v.size();i++){
dfs(nod->v[i]);
nod->sol+=nod->v[i]->sol;
}
}
int main(void){
register int i,j;
root=new trie;
f>>S;
f>>n;
for(i=1;i<=n;i++)
f>>a,w[i]=update(root,a);
Q.push(root);
while(!Q.empty()){
nod=Q.front();
Q.pop();
for(i=0;i<26;i++){
#define fiu p[i]
if(nod->fiu){
//construim back-ul pt nod->fiu
aux=nod->ret;
while(aux && aux->fiu==NULL) aux=aux->ret;
if(aux==0)
nod->fiu->ret=root;
else
nod->fiu->ret=aux->fiu;
nod->fiu->ret->v.push_back(nod->fiu);
Q.push(nod->fiu);
}
}
}
nod=root;
for(P=S;*P;P++){
#define fiu p[*P-'a']
while(nod!=root && nod->fiu==NULL) nod=nod->ret;
if(nod->fiu!=NULL) nod=nod->fiu;
nod->sol++;
}
dfs(root);
for(i=1;i<=n;i++)
g<<w[i]->sol<<"\n";
f.close();
g.close();
return 0;
}