Cod sursa(job #754216)

Utilizator IrikosIrikos Irikos Data 1 iunie 2012 03:06:49
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
/*    TRIE - LFA*/

#include <cstdio>
#include <cstring> 

#define STR (*s - 'a')

using namespace std;


struct Trie
{
       int nrCuv, nrFii;               // nr de cuvinte care se termina in nodul curent           // nr de cuvinte care au cuvantul pana la nodul curent drept prefix
       Trie *fiu[26];           // pt fiecare litera a alfabetului
       Trie()
       {
             nrCuv = nrFii = 0;
             memset(fiu, 0, sizeof(fiu));
       }
};

Trie *T = new Trie;


void insert(Trie *cuvant, char *s)
{
     if(*s == '\n')
     {
            cuvant->nrCuv ++;
            return;
     }
     if(cuvant->fiu[STR] == 0)
     {
            cuvant->fiu[STR] = new Trie;
            cuvant->nrFii++;
     }
     insert(cuvant->fiu[STR], s + 1);
} 

int del(Trie *cuvant, char *s)
{
    if(*s == '\n')
          cuvant->nrCuv--;
    else if( del(cuvant->fiu[STR], s + 1))
         {
             cuvant->fiu[STR] = 0;
             cuvant->nrFii --;     
         }
         if((cuvant->nrCuv == 0) && (cuvant->nrFii == 0) && (cuvant != T))  // daca nu are cuvinte care se termina in el, nu mai are nici fii si nu e nici radacina
         {
             delete cuvant;
             return 1;
         }
    return 0;
}

int cuv(Trie *cuvant, char *s)
{
    if(*s == '\n') return cuvant->nrCuv;
    
    if(cuvant->fiu[STR])
         return cuv(cuvant->fiu[STR], s + 1);
    return 0;
}

int pref(Trie *cuvant, char *s, int k)
{
    if(*s == '\n' || cuvant->fiu[STR] == 0) return k;
    return pref( cuvant->fiu[STR], s+1, k+1 );
}


int main() 
{
char line[ 32 ];
 
freopen( "trie.in", "r", stdin );
freopen( "trie.out", "w", stdout );
 
fgets( line, 32, stdin );
 
while( !feof( stdin ) ) 
{
 switch( line[0] ) 
 {
  case '0': insert( T, line + 2 ); break;
  case '1': del( T, line + 2 ); break;
  case '2': printf( "%d\n", cuv( T, line + 2 ) ); break;
  case '3': printf( "%d\n", pref( T, line + 2, 0 ) ); break;
 } 
fgets( line, 32, stdin );
}
return 0;
}