Cod sursa(job #1458403)

Utilizator rangerChihai Mihai ranger Data 7 iulie 2015 14:28:46
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<fstream>
#include<string>
#include<vector>


using namespace std;

const int NMAX = 100000;

 int t[NMAX][26];
 int nr[NMAX];    // nr[i] =  numarul de cuvinte ce 'trec' prin nodul i
 int endhere[NMAX]; // endhere[i] =  numarul de cuvinte ce se termina in nodul i


 // t[i][j] - nodul la care ajungem din nodul i plecand pe muchia cu litera j
 // 0 - nodul radacina

 int next=1;  // numarul de noduri din trie la momentul curent


ifstream cin("trie.in");
ofstream cout("trie.out");

 void init()
 {
     for (int i=0;i<NMAX;i++)
        for (int j=0;j<26;j++) t[i][j]=-1;
 }

 void insereaza(string s)
 {
     int nod=0;
     for (int i=0;i<s.size();i++)
     {
         if (t[nod][s[i]-'a']==-1) nod = t[nod][s[i]-'a'] = next++;
         else nod = t[nod][s[i]-'a'];
         nr[nod]++;
     }
     endhere[nod]++;
 }

void sterge(string s)
{
    int nod=0;
    for (int i=0;i<s.size();i++)
    {
        nod=t[nod][s[i]-'a'];
        nr[nod]--;
    }
    endhere[nod]--;
}

int prefix(string s)
{
   int nod=0, ret=0;
   for (int i=0;i<s.size();i++)
   {
      if (t[nod][s[i]-'a']==-1) return ret;
      nod = t[nod][s[i]-'a'];
      if (nr[nod]) ret = i+1;
   }
   return  ret;
}

int query(string s)
{
    int nod=0;
    for (int i=0;i<s.size();i++)
    {
        if (t[nod][s[i]-'a']==-1) return 0;
        nod=t[nod][s[i]-'a'];
    }
    return endhere[nod];
}

int main()
{
   int  tip; string s;
   init();
   while (cin>>tip>>s)
   {
       if (tip==0) insereaza(s);
       if (tip==1) sterge(s);
       if (tip==2) cout<<query(s)<<'\n';
       if (tip==3) cout<<prefix(s)<<'\n';
   }
   cin.get();
    return 0;
}