Cod sursa(job #2389846)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 27 martie 2019 15:30:44
Problema Aho-Corasick Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#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;
}