Cod sursa(job #309600)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 30 aprilie 2009 19:11:59
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
# include <cstdio>
# include <string>

using namespace std;

# define FIN "trie.in"
# define FOUT "trie.out"
# define MAXLEN 30

struct Trie
{
     int Ap, Ct;
     Trie *Fiu[MAXLEN];
     
     Trie()
     {
         Ap = Ct = 0;
         memset(Fiu, 0, sizeof(Fiu));
     }
} *Arb;

int Op, L;
char sir[MAXLEN];

     void Add(Trie *P, int Ind)
     {
         if (Ind > L)
         {
              ++P -> Ct;
              return;
         }
          
         if (!P -> Fiu[sir[Ind] - 'a'])
         {
             ++P -> Ap;
             P -> Fiu[sir[Ind] - 'a'] = new Trie;
         }

         Add(P -> Fiu[sir[Ind] - 'a'], Ind + 1);
     }
     
     int Del(Trie *P, int Ind)
     {
         Trie *F;
         
         if (Ind > L)
         {
             --P -> Ct;
             if (!P -> Ct && !P -> Ap) return 1;
             return 0;
         }
         
         if (Del(P -> Fiu[sir[Ind] - 'a'], Ind + 1))
         {
             --P -> Ap;
             F = P -> Fiu[sir[Ind] - 'a'];
             P -> Fiu[sir[Ind] - 'a'] = NULL;
             delete (F);
             
             if (!P -> Ap && !P -> Ct) return 1;
         }
         
         return 0;
     }
     
     void Print(Trie *P, int Ind)
     {
         if (Ind > L)
         {
              printf("%d\n", P -> Ct);
              return;
         }
         
         if (!P -> Fiu[sir[Ind] - 'a'])
         {
              printf("0\n");
              return;
         }
         
         Print(P -> Fiu[sir[Ind] - 'a'], Ind + 1);
     }
     
     void Prefix(Trie *P, int Ind)
     {
         if (Ind > L || !P -> Fiu[sir[Ind] - 'a'])
         {
              printf("%d\n", Ind - 1);
              return;
         }
         
         Prefix(P -> Fiu[sir[Ind] - 'a'], Ind + 1);
     }

     int main()
     {
         freopen(FIN, "r", stdin);
         freopen(FOUT, "w", stdout);
         
         Arb = new Trie;
         for (; scanf("%d ", &Op) != EOF;)
         {
             gets(sir + 1); L = strlen(sir + 1);
             
             if (Op == 0) Add(Arb, 1);
             if (Op == 1) Del(Arb, 1);
             if (Op == 2) Print(Arb, 1);
             if (Op == 3) Prefix(Arb, 1);
         }
         
         return 0;
     }