Pagini recente » Cod sursa (job #3192129) | Cod sursa (job #2623850) | Cod sursa (job #3292760) | Cod sursa (job #3283860) | Cod sursa (job #3265346)
#include <fstream>
#include <vector>
#include <deque>
using namespace std;
ifstream cin("ahocorasick.in");
ofstream cout("ahocorasick.out");
struct trie{
int val;
trie *fall,*c[26];
trie(){
val=0;
for(int i=0;i<26;i++) c[i]=nullptr;
fall=nullptr;
}
};
vector<trie*> capete,ordine;
deque<trie*> q;
void add(trie *nod,int poz,string &s){
if(poz==s.size()){
capete.push_back(nod);
return ;
};
if(nod->c[s[poz]-'a']==nullptr)
nod->c[s[poz]-'a']=new trie();
add(nod->c[s[poz]-'a'],poz+1,s);
}
int main()
{
string si,s;
int n,i;
cin>>si>>n;
trie* root=new trie();root->fall=root;
for(i=1;i<=n;i++){
cin>>s;
add(root,0,s);
}
q.push_back(root);
while(!q.empty()){
auto it=q.front();
ordine.push_back(it);
q.pop_front();
for(i=0;i<26;i++){
if(it->c[i]==nullptr) continue;
auto cit=it;
auto c=it->c[i];
it=it->fall;
while(it!=root && it->c[i]==nullptr) it=(it->fall);
if(it->c[i]!=nullptr && it->c[i]!=c)
c->fall=it->c[i];
else
c->fall=root;
q.push_back(c);
it=cit;
}
}
auto poz=root;
for(i=0;i<si.size();i++){
while(poz!=root && poz->c[si[i]-'a']==nullptr) poz=poz->fall;
if(poz->c[si[i]-'a']!=nullptr){
poz=poz->c[si[i]-'a'];
}
poz->val++;
}
for(i=ordine.size()-1;i>=0;i--){
(ordine[i]->fall)->val+=ordine[i]->val;
}
for(i=0;i<n;i++){
cout<<capete[i]->val<<"\n";
}
return 0;
}