Cod sursa(job #3265346)

Utilizator PetruApostolApostol Mihnea Petru PetruApostol Data 29 decembrie 2024 16:01:24
Problema Aho-Corasick Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#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;
}