Pagini recente » Cod sursa (job #1362817) | Cod sursa (job #1858283) | Cod sursa (job #1155903) | Cod sursa (job #2553771) | Cod sursa (job #2389846)
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
using namespace std;
int n;
int sol[105];
struct trie{
int cv, k;
trie *fii[26];
trie *tata;
trie(){
cv=n;
k=0;
for(int i=0;i<26;++i)
fii[i]=NULL;
tata=NULL;
}
}*r;
vector <trie*> st;
string a,x;
vector <string> cv;
void adauga(trie *& nod, int poz, int ord){
if(x[poz]==0){
nod->cv=ord;
return ;
}
if(nod->fii[x[poz]-'a']==NULL)
nod->fii[x[poz]-'a']=new trie();
adauga(nod->fii[x[poz]-'a'],poz+1,ord);
}
void cauta(trie *nod, int poz){
//cout<<a[poz]<<"\n";
if(a[poz]==0)
return;
while(nod!=r && nod->fii[a[poz]-'a']==NULL)
nod=nod->tata;
if(nod->fii[a[poz]-'a']!=NULL)
nod=nod->fii[a[poz]-'a'];
nod->k++;
cauta(nod,poz+1);
}
int main()
{
freopen("ahocorasick.in","r",stdin);
freopen("ahocorasick.out","w",stdout);
getline(cin,a);
scanf("%d\n", &n);
r=new trie();
r->tata = r;
for(int i=0;i<n;++i){
getline(cin,x);
cv.push_back(x);
adauga(r,0,i);
}
int k=0,len=0;
for(int i=0;i<26;++i)
if(r->fii[i]!=NULL){
r->fii[i]->tata=r;
st.push_back(r->fii[i]);
++len;
}
while(k<len){
trie * l = st[k++];
for(int i=0;i<26;++i)
if(l->fii[i]!=NULL){
trie *prefix = l->tata;
while(prefix->fii[i]==NULL && prefix!=r)
prefix=prefix->tata;
if(prefix->fii[i])
l->fii[i]->tata=prefix->fii[i];
else
l->fii[i]->tata=r;
st.push_back(l->fii[i]);
++len;
}
}
cauta(r,0);
while(len>0){
trie* l = st[--len];
l->tata->k+=l->k;
sol[l->cv]=l->k;
}
for(int i=0;i<n;++i)
cout<<sol[i]<<"\n";
return 0;
}