Cod sursa(job #1987069)

Utilizator LizaSzabo Liza Liza Data 29 mai 2017 18:58:17
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Node
{
  int Nr,NrSons;
  Node * Son[26];
  Node()
  {
    Nr = NrSons = 0;
    for(int i = 0; i < 26; ++i)
      Son[i] = 0;
  }
};

Node * Trie = new Node;

void Insert(Node * T, char p[25])
{
  if(p[0] == 0)
    {
      T -> Nr ++;
      return;
    }
  int Index = p[0] - 'a';
  if(!T->Son[Index])
  {
    T -> Son[Index] = new Node;
    T -> NrSons ++;
  }

  Insert(T -> Son[Index], p + 1);
}

int Delete(Node * T, char * p)
{
    if(p[0] == 0)
      {
          T -> Nr --;
      }
    else
      {
          int Index = p[0] - 'a';
          int Value = Delete(T -> Son[Index],p + 1);
          if(Value == 1)
          {
            T -> Son[Index] = 0; T -> NrSons--;
          }
      }
    if(T -> Nr == 0 && T -> NrSons == 0 && T != Trie)
      {
          delete T;
          return 1;
      }
    return 0;
}

int Find(Node * T, char * p)
{
  if(p[0] == 0)
    return T -> Nr;

  int Index = p[0] - 'a';
  if(T -> Son[Index])
    return Find(T -> Son[Index], p + 1);

  return 0;
}

int Prefix(Node * T, char * p, int k)
{
  if(p[0] == 0)
    return k;

  int Index = p[0] - 'a';
  if(T -> Son[Index])
     return Prefix(T -> Son[Index], p + 1, k + 1);

  return k;
}

int main()
{
    char Word[25];

    while(fin.getline(Word,25))
    {
      if(Word[0] == '0')
        Insert(Trie,Word + 2);
      if(Word[0] == '1')
        Delete(Trie, Word + 2);
      if(Word[0] == '2')
        fout << Find(Trie, Word + 2) << "\n";
      if(Word[0] == '3')
        fout << Prefix(Trie, Word + 2, 0) << "\n";
    }
    return 0;
}