Cod sursa(job #2317051)

Utilizator dacianouaPapadia Mortala dacianoua Data 12 ianuarie 2019 18:39:45
Problema Aho-Corasick Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
#include <string.h>
#include <deque>
#include <iostream>
#define nmax 100
#define L 1000000
#define l 10000
using namespace std;
int n,val[nmax+5],p[nmax+5];
char text[L+5],cuv[l+5];
struct trie
{
    int k,val;
    trie* fiu[26],*fail;
    trie()
    {
        val=0;
        k=0;
        memset(fiu,0,sizeof(fiu));
    }
}*v;
deque<trie*> q1,q2;
void add(int k, char *charr)
{
    trie *d=v;
    while(*charr!='\0')
    {
        if(!d->fiu[charr[0]-'a'])
            d->fiu[charr[0]-'a']=new trie;
        d=d->fiu[charr[0]-'a'];
        charr++;
    }
    if(d->k==0)
        d->k=k;
    p[k]=k;
}
void link()
{
    v->fail=v;
    trie *d,*f;
    for(int i=0;i<26;i++)
        if(v->fiu[i])
        q1.push_back(v->fiu[i]),v->fiu[i]->fail=v;
    while(!q1.empty())
    {
        d=q1.front();
        q1.pop_front();
        q2.push_back(d);
        for(int i=0;i<26;i++)
            if(d->fiu[i])
            {
                f=d->fail;
                while(f!=v && !f->fiu[i])
                    f=f->fail;
                if(f->fiu[i])
                    d->fiu[i]->fail=f->fiu[i];
                else
                    d->fiu[i]->fail=v;
                q1.push_back(d->fiu[i]);
            }
    }
}
void match(char *a)
{
    trie* d=v;
    while(*a)
    {
        while(d!=v && !d->fiu[a[0]-'a'])
            d=d->fail;
        if(d->fiu[a[0]-'a'])
            d=d->fiu[a[0]-'a'];
        d->val++;
        a++;
    }
}
void solve()
{
    trie *d;
    while(!q2.empty())
    {
        d=q2.back();
        q2.pop_back();
        d->fail->val+=d->val;
        if(!val[d->k])
            val[d->k]=d->val;
    }
}
int main()
{
    ifstream fin("ahocorasick.in");
    ofstream fout("ahocorasick.out");
    fin>>text;
    fin>>n;
    v=new trie;
    for(int i=1;i<=n;i++)
    {
        fin>>cuv;
        add(i,cuv);
    }
    link();
    match(text);
    solve();
    for(int i=1;i<=n;i++)
        fout<<val[p[i]]<<"\n";
    return 0;
}