Cod sursa(job #2376527)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 8 martie 2019 16:10:45
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int Sigma = 26;
char Line[30];
struct Trie
{
    int Nr,NrSons;
    Trie * Son[Sigma];
    Trie()
    {
        Nr = NrSons = 0;
        for(int i = 0; i < Sigma; ++i)
            Son[i] = 0;
    }
};

Trie * T = new Trie;

void Insert(char * p, Trie * Nod)
{
    if(*p == 0)
    {
        Nod->Nr++;
        return;
    }

    int Next = p[0] - 'a';
    if(Nod -> Son[Next] == 0)
        {
            Nod -> Son[Next] = new Trie;
            Nod -> NrSons++;
        }

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

int Find(char * p, Trie * Nod)
{
    if(*p == 0)
        return Nod->Nr;
    int Next = p[0] - 'a';
    if(Nod->Son[Next])
        return Find(p+1,Nod->Son[Next]);
    else
        return 0;
}

int Prefix(char * p, Trie * Nod, int k)
{
    if(*p ==0)
        return k;
    int Next = p[0] - 'a';
    if(Nod->Son[Next])
        return Prefix(p+1,Nod->Son[Next],k+1);
    else
        return k;
}

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

int main()
{
    while(fin.getline(Line,30))
    {
        if(Line[0] == '0')
            Insert(Line + 2, T);
        if(Line[0] == '1')
            Delete(Line + 2, T);
        if(Line[0] == '2')
            fout << Find(Line + 2, T) << "\n";
        if(Line[0] == '3')
            fout << Prefix(Line + 2, T, 0) << "\n";
    }
    return 0;
}