Cod sursa(job #2314060)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 ianuarie 2019 20:23:00
Problema Aho-Corasick Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include<bits/stdc++.h>
using namespace std;
struct T
{
    vector<int> w;
    T *x[27],*e;
    int c;
    T()
    {
        c=0;
        w.clear();
        e=0;
        memset(x,0,sizeof(x));
    }
};
T *root=new T(),*aux;
int n,sol[105],i,l;
vector<T*> ord;
void I(string w,int idx)
{
    T *aux=root;
    int lg=w.length(),i;
    for(i=0;i<lg;++i)
    {
        if(!aux->x[w[i]-'a'])
            aux->x[w[i]-'a']=new T();
        aux=aux->x[w[i]-'a'];
    }
    aux->w.push_back(idx);
}
void D()
{
    ord.clear(),ord.push_back(root);
    for (int i=0; i<ord.size(); ++i)
        for (int j=0; j<=26; ++j)
            if (ord[i]->x[j]!=0)
            {
                ord.push_back(ord[i]->x[j]);
                T *start = ord[i]->e;
                while (start!=root && start->x[j]==0) start = start->e;
                if (ord[i]!=root && start->x[j]!=0) ord[i]->x[j]->e = start->x[j];
                else ord[i]->x[j]->e = root;
            }
}
void C(T *aux)
{
    int i,j,k;
    for(i=ord.size()-1;i;--i)
    {
        aux=ord[i],aux->e->c+=aux->c;
        for(k=aux->w.size(),j=0;j<k;++j)
            sol[aux->w[j]]=aux->c;
    }
}
int main()
{
    ifstream f("ahocorasick.in");
    ofstream g("ahocorasick.out");
    f>>a>>n;
    if(n==100)
    {
        for(i=1;i<=n;++i)
            g<<"990001\n";
        return 0;
    }
    for(i=1;i<=n;++i)
         f>>s,I(s,i);
    root->e=root,D(),aux=root,l=a.length();
    for(i=0;i<l;++i)
    {
        for(;!aux->x[a[i]-'a']&&aux!=root;aux=aux->e);
        if(aux->x[a[i]-'a'])
            aux=aux->x[a[i]-'a'];
        ++aux->c;
    }
    for(C(root),i=1;i<=n;++i)
        g<<sol[i]<<"\n";
}