Cod sursa(job #2975963)

Utilizator Vincent47David Malutan Vincent47 Data 7 februarie 2023 21:57:47
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>
#include <cstring>
#define ch (*s - 'a')
using namespace std;

    ifstream cin("trie.in");
    ofstream cout("trie.out");

    struct Trie{
    int nr_cuv, nr_sons;
    Trie* son[26];
    Trie(){
    nr_cuv = nr_sons = 0;
    memset(son, 0, sizeof(son));
    }
    };

    Trie *T = new Trie;
    char sir[26];

    void Insert(Trie *nod, char *s)
    {
        if(*s == '\0')
        {
            nod -> nr_cuv ++;
            return;
        }
        else if (nod -> son[ch] == 0)
        {
            nod -> son[ch] = new Trie;
            nod -> nr_sons ++;
        }
        Insert(nod ->son[ch], s + 1);
    }

    bool del(Trie *nod, char *s)
    {
        if (*s == '\0')
            nod -> nr_cuv --;
        else if (del(nod -> son[ch], s + 1))
        {
            nod -> son[ch] = 0;
            nod -> nr_sons --;
        }
        if (nod -> nr_cuv == 0 && nod -> nr_sons == 0 && nod != T)
        {
            delete nod;
            return true;
        }
        return false;
    }

    int Count(Trie *nod, char *s)
    {
        if (*s == '\0')
        return nod -> nr_cuv;
        if (nod -> son[ch])
        return Count(nod -> son[ch], s + 1);
        return 0;
    }

    int Prefix(Trie *nod, char *s, int k)
    {
        if (*s == '\0' || nod -> son[ch] == 0)
            return k;
        return Prefix(nod -> son[ch], s + 1, k + 1);
    }

int main()
{
    char sir[26];

    while(cin.getline(sir, 26))
    {
        switch(sir[0])
        {
            case '0': Insert(T, sir + 2);
            break;
            case '1': del(T, sir + 2);
            break;
            case '2': cout << Count(T, sir + 2) << '\n';
            break;
            case '3': cout << Prefix(T, sir + 2, 0) << '\n';
        }
    }
    return 0;
}