Pagini recente » Cod sursa (job #1203783) | Cod sursa (job #2257929) | Cod sursa (job #2169727) | Cod sursa (job #2459810) | Cod sursa (job #2527294)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
int n;
char a[1000010],s[10010];
struct trie {
int nr;
trie *fii[26];
trie *BACK;
vector<trie*> v;
trie(){
nr=0;
BACK=0;
for(int i=0;i<26;i++)
fii[i]=0;
}
};
trie *rad=new trie;
trie *nod,*fiu;
trie *w[102];
queue<trie*>q;
trie *insert(trie *nod,char *point){
if(*point==0){
return nod;
}
if(nod->fii[*point-'a']==0){
nod->fii[*point-'a']=new trie;
}
return insert(nod->fii[*point-'a'],point+1);
}
void dfs(trie *nod){
for(int i=0;i<nod->v.size();i++) {
dfs(nod->v[i]);
nod->nr+=nod->v[i]->nr;
}
}
int main(){
fin>>a;
fin>>n;
for(int i=1;i<=n;i++){
fin>>s;
w[i]=insert(rad,s);
}
q.push(rad);
while( !q.empty() ){
nod=(trie*)q.front();
q.pop();
for(int i=0;i<26;i++)
if(nod->fii[i]){
fiu=nod->BACK;
while(fiu && fiu->fii[i]==0){
fiu=fiu->BACK;
}
if(!fiu){
nod->fii[i]->BACK=rad;
}
else{
nod->fii[i]->BACK=fiu->fii[i];
}
nod->fii[i]->BACK->v.push_back(nod->fii[i]);
q.push(nod->fii[i]);
}
}
char *point;
for(point=a,fiu=rad ;*point!=0; point++){
while(fiu->fii[*point-'a']==0 && fiu){
fiu=fiu->BACK;
}
if(fiu==0){
fiu=rad;
}
else{
fiu=fiu->fii[*point-'a'];
}
fiu->nr++;
}
dfs(rad);
for(int i=1;i<=n;i++){
fout<<w[i]->nr<<"\n";
}
return 0;
}