Cod sursa(job #980989)

Utilizator misinoonisim necula misino Data 6 august 2013 09:31:51
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<fstream>
#include<cstring>
#include<vector>
using namespace std;
ifstream f("ahocorasick.in");
ofstream g("ahocorasick.out");
int i,p,n;
char s[1000010],s1[10100];
struct trie{
    trie *fii[26],*fiu;
    int v;
    trie(){
        fiu=0;
        memset(fii,0,sizeof(fii));
        v=0;
    }
};
vector<trie *>q;
trie *t,*sol[110];
inline trie * insereaza(trie *t,char *p)
{
    if(!*p)
    return t;
    if(!t->fii[*p-'a'])
    t->fii[*p-'a']=new trie;
    return insereaza(t->fii[*p-'a'],p+1);
}
int main()
{
    f>>s>>n;
    t=new trie;
    for(i=1;i<=n;++i)
    {
        f>>s1;
        sol[i]=insereaza(t,s1);
    }
    trie *t1,*t2;
    q.push_back(t);
    for(p=0;p<q.size();++p)
    {
        t1=q[p];
        for(i=0;i<=25;++i)
        if(t1->fii[i])
        {
            for(t2=t1->fiu;t2&&!t2->fii[i];t2=t2->fiu);
            if(t2)
            t1->fii[i]->fiu=t2->fii[i];
            else
            t1->fii[i]->fiu=t;
            q.push_back(t1->fii[i]);
        }
    }
    t1=t;
    for(i=0;s[i];++i)
    {
        while(t1&&!t1->fii[s[i]-'a'])
        t1=t1->fiu;
        if(!t1)
        {
            t1=t;
        }
        else
        {
            t1=t1->fii[s[i]-'a'];
            ++t1->v;
        }
    }
    for(i=q.size()-1;i>=0;--i)
    {
        if(q[i]->fiu)
        q[i]->fiu->v+=q[i]->v;
    }
    for(i=1;i<=n;++i)
    g<<sol[i]->v<<'\n';
    return 0;
}