Cod sursa(job #2929310)

Utilizator SeracovanuEdwardSeracovanu Edward SeracovanuEdward Data 25 octombrie 2022 15:48:56
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;

struct Trie
{
    int Nr,NrSons;
    Trie * Son[26];
    Trie()
    {
        Nr = NrSons = 0;
        for(int i = 0; i < 26; ++i)
            Son[i] = 0;
    }
};
Trie * T = new Trie;
char Line[25];

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

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

int Prefix(char * Cuv, Trie * Nod)
{
    if(*Cuv == 0 || Nod -> Son[Cuv[0] - 'a'] == 0)
        return 0;
    return 1 + Prefix(Cuv + 1, Nod->Son[Cuv[0] - 'a']);
}
bool Delete(char * Cuv, Trie * Nod)
{
    if(*Cuv == 0)
    {
        Nod -> Nr--;
    }
    else
    if( Delete(Cuv + 1, Nod->Son[Cuv[0] - 'a']) == 1)
    {
            Nod->Son[Cuv[0] - 'a'] = 0;
            Nod->NrSons--;
    }
    if(Nod->Nr == 0 && Nod->NrSons == 0 && Nod != T)
    {
        delete Nod;
        return 1;
    }
    return 0;
}
int main()
{
    freopen("trie.in" , "r" , stdin);
    freopen("trie.out" , "w" ,stdout);
    cin.tie(0)->sync_with_stdio(0);
    while(cin.getline(Line,25))
    {
        if(Line[0] == '0')
            Insert(Line + 2, T);
        if(Line[0] == '1')
            Delete(Line + 2, T);
        if(Line[0] == '2')
            cout << Print(Line + 2,T) << "\n";
        if(Line[0] == '3')
            cout << Prefix(Line + 2, T) << "\n";
    }
}