Cod sursa(job #2523203)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 13 ianuarie 2020 20:31:53
Problema Aho-Corasick Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <vector>
#include <deque>
#define fiu f[*s-'a']
using namespace std;
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
struct trie{
    int sol=0;
    trie *f[26], *back=0;
    vector<trie *> v;
    trie() {
        for (int i=0;i<26;i++)
            f[i]=0;
        v.clear();
    }
};
char A[1000010],s[10010];
int n,i;
deque<trie *> q;
trie *root=new trie();
trie *w[110],*nod,*aux;
trie *add(trie *r, char *s) {
    if (*s==0)
        return r;
    if (r->fiu==nullptr)
        r->fiu=new trie;
    return add(r->fiu,s+1);
}
void dfs(trie *nod) {
    for (int i=0;i<nod->v.size();i++) {
        dfs(nod->v[i]);
        nod->sol+=nod->v[i]->sol;
    }
}
int main() {
    fin>>A;
    fin>>n;
    for (i=1;i<=n;i++) {
        fin>>s;
        w[i]=add(root,s);
    }
    q.push_back(root);
    while (!q.empty()) {
        nod=q.front();
        q.pop_front();
        for (i=0;i<26;i++) {
            if (nod->f[i]) {
                aux=nod->back;
                while (aux&&aux->f[i]==nullptr)
                    aux=aux->back;
                if (aux==0)
                    nod->f[i]->back=root;
                else
                    nod->f[i]->back=aux->f[i];
                nod->f[i]->back->v.push_back(nod->f[i]);
                q.push_back(nod->f[i]);
            }
        }
    }
    aux=root;
    for (i=0;A[i]!=0;i++) {
        while (aux!=root&&aux->f[A[i]-'a']==nullptr)
            aux=aux->back;
        if (aux->f[A[i]-'a']!=nullptr)
            aux=aux->f[A[i]-'a'];
        aux->sol++;
    }
    dfs(root);
    for (i=1;i<=n;i++)
        fout<<w[i]->sol<<"\n";
    return 0;
}