Cod sursa(job #1575751)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 21 ianuarie 2016 20:08:25
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
using namespace std;

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

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

Trie * T = new Trie;

void Insert(Trie * Nod, char * p)
{
    int Letter = *p - 'a';

    if(*p == 0)
    {
        Nod->Nr++;
        return;
    }

    if(Nod->Son[Letter]==0)
    {
        Nod->NrSons++;
        Nod->Son[Letter] = new Trie;
    }

        Insert(Nod->Son[Letter],p+1);
}

int Delete(Trie * Nod, char * p)
{
    int Letter = *p - 'a';

    if(*p == 0)
        Nod -> Nr--;
    else
        if(Delete(Nod->Son[Letter] , p+1) == 1)
            {
                Nod -> Son[Letter] = 0;
                Nod -> NrSons--;
            }
    if(Nod -> Nr == 0 && Nod -> NrSons == 0 && Nod != T)
        {
            delete Nod;
            return 1;
        }
    return 0;

}

int Find(Trie * Nod, char * p)
{
    int Letter = *p - 'a';

    if(*p == 0)
        return Nod->Nr;

    if(Nod->Son[Letter])
        return Find(Nod->Son[Letter],p+1);

    return 0;
}

int FindP(Trie * Nod, char * p,int Count)
{
    int Letter = *p - 'a';
    if(*p == 0 || Nod->Son[Letter] == 0)
        return Count;

    return FindP(Nod->Son[Letter],p + 1,Count + 1);

}

int main()
{
    char S[100];

    while(fin.getline(S,100))
        {
            int op = S[0]-48;

            if(op == 0)
                Insert(T,S+2);
            if(op == 1)
                Delete(T,S+2);
            if(op == 2)
                fout<<Find(T,S+2)<<"\n";
            if(op == 3)
                fout<<FindP(T,S+2,0)<<"\n";
        }
    return 0;
}