Cod sursa(job #3276921)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 15 februarie 2025 10:08:27
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 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 * Root = new Trie;

int Print(Trie * Nod, char String[])
{
    if( !(*String) )
        return Nod -> Nr;
    if(! (Nod->Son[*String - 'a']))
        return 0;
    return Print(Nod->Son[*String - 'a'], String + 1);
}

int Prefix(Trie * Nod, char String[], int k)
{
    if( !(*String) )
        return k;

    if(! (Nod->Son[*String - 'a']))
        return k;

    return Prefix(Nod->Son[*String - 'a'], String + 1,k + 1);
}

void Insert(Trie * Nod, char String[])
{
    if( !(*String) )
    {
        Nod -> Nr++ ;
    }
    else
    {
    if(! (Nod->Son[*String - 'a']))
       {
            Nod->Son[*String - 'a'] = new Trie;
            Nod->NrSons++;
       }

    Insert(Nod->Son[*String - 'a'], String + 1);
    }
}

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


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