Cod sursa(job #2001642)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 17 iulie 2017 13:08:45
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include<bits/stdc++.h>
#define Succ S[it]
using namespace std;
ifstream f("ahocorasick.in");
ofstream g("ahocorasick.out");
struct nod
{
    deque<int> succ;
    int A;
    nod *S[26],*F;
    nod()
    {
        succ.resize(0);
        A=0;
        for(int i=0; i<26; i++)S[i]=0;
        F=0;
    }
};
nod *R,*poz[110];
vector<nod*> Q;
int n,i,b,t;
char P[1000010],C[10010];
void read(),solve();
int main()
{
    read();
    solve();
    return 0;
}
void read()
{
    char *c;
    nod *N;
    int k;
    R=new nod;
    f>>P>>n;
    for(i=1; i<=n; i++)
    {
        f>>C;
        for(c=C,N=R; *c; c++)
        {
            k=*c-'a';
            if(!N->S[k])
            {
                N->S[k]=new nod;
                N->succ.push_back(k);
            }
            N=N->S[k];
        }
        poz[i]=N;
    }
}
void solve()
{
    nod *N;
    char *c;
    R->F=R;
    for(auto it: R->succ)
    {
        R->Succ->F=R;
        Q.push_back(R->Succ);
    }
    for(size_t i=0; i< Q.size(); i++)
    {
        nod *nd=Q[i];
        for(auto it: nd->succ)
        {
            for(N=nd->F;; N=N->F)
            {
                if(N->Succ)
                {
                    nd->Succ->F=N->Succ;
                    break;
                }
                if(N==R)
                {
                    nd->Succ->F=R;
                    break;
                }
            }
            Q.push_back(nd->Succ);
        }
    }
    for(c=P,N=R; *c;)
    {
        if(N->S[*c-'a'])
        {
            N=N->S[*c-'a'];
            N->A++;
            c++;
            continue;
        }
        if(N==R)
        {
            c++;
            continue;
        }
        N=N->F;
    }
    for(; Q.size(); Q.pop_back())Q.back()->F->A+=Q.back()->A;
    for(i=1; i<=n; i++)g<<(poz[i]->A)<<'\n';
}