Cod sursa(job #1280256)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 1 decembrie 2014 17:50:55
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
ifstream f("ahocorasick.in");
ofstream g("ahocorasick.out");

 struct trie
 { int sol,ad;

    trie * fiu[28];
    trie * fail;
    vector <int> v;

   trie()
   { for(int i=1;i<=27;i++)
       fiu[i]=NULL;
    sol=0;
   }

 };
 int n,k,ap[105];
 trie *el[1000005];

 trie rad,*act;
 char sir[1000005],s[10005];
 queue <trie*> q;

 void Insert(char s[10005],int ind)
 { int i,len=strlen(s),x;
    act=&rad;
    act->ad=0;

    for(i=0;i<len;i++)
    { x=s[i]-96;

      if (act->fiu[x]==NULL) act->fiu[x]=new trie;
      (act->fiu[x])->ad=act->ad+1;
      act=act->fiu[x];

    }

   act->v.push_back(ind);
 }

 void BFS()
 { int i=0;
     trie *nod,*nod2,*fact;
   act=&rad;
   act->fail=act;
   q.push(act);

   while(!q.empty())
   { nod=q.front(); q.pop();
   // cout<<nod<<" "<<i<<"\n";
     k++; el[k]=nod;

      for(i=1;i<=26;i++)
       if (nod->fiu[i]!=NULL)
       {
         nod2=nod->fiu[i];
         q.push(nod2);
         fact=nod->fail;



          while(fact->fiu[i]==NULL && fact!=&rad)
           fact=fact->fail;

          if (fact->fiu[i]!=NULL) fact=fact->fiu[i];

          if (nod2->ad==1) fact=&rad;

       //  cout<<"i="<<i<<" fail="<<fact<<"\n";

          nod2->fail=fact;
       }

   }

 }

 void AhoCorasick()
 { int i,x,len=strlen(sir);

    act=&rad;

     for(i=0;i<len;i++)
     { x=sir[i]-96;

        while(act->fiu[x]==NULL && act!=&rad)
          act=act->fail;

        if (act->fiu[x]!=NULL) act=act->fiu[x];

       act->sol++;
     }

 }

 void RevBFS()
 { int i,j;

  for(i=k;i>=1;i--)
   {
     for(j=0;j<el[i]->v.size();j++)
      ap[el[i]->v[j]]=el[i]->sol;

     (el[i]->fail)->sol+=el[i]->sol;
   }

 }
int main()
{ int i;
      f.getline(sir,1000003);
      f>>n;
      for(i=1;i<=n;i++)
      {
        f>>s;
        Insert(s,i);
      }

      BFS();
      AhoCorasick();
      RevBFS();

      for(i=1;i<=n;i++)
       g<<ap[i]<<"\n";
    return 0;
}