Cod sursa(job #2487132)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 4 noiembrie 2019 00:28:21
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
#include <bits/stdc++.h>

using namespace std;

struct Node
{
    int contor = 0;
    unordered_map<char, Node*> copil;

} *trie = new Node;


void adauga(char* cuvant)
{
    Node* aux = trie;

    for(int i = 0; cuvant[i] != '\0'; ++i)
    {
        char caracter = cuvant[i];

        if(aux->copil.find(caracter) == aux->copil.end())
            aux->copil.insert({caracter, new Node});

        aux = aux->copil.at(caracter);
    }

    aux->contor++;
}

Node* sterge(char* cuvant, Node* nod = trie)
{
    char caracter = cuvant[0];

    if(caracter == '\0')
    {
        nod->contor--;
        return nod;
    }

    nod->copil.at(caracter) = sterge(cuvant + 1, nod->copil.at(caracter));

    if(nod->copil.at(caracter)->contor == 0 && nod->copil.at(caracter)->copil.size() == 0) nod->copil.erase(caracter);

    return nod;
}

int numar_aparitii(char* cuvant)
{
    Node* aux = trie;

    for(int i = 0; cuvant[i] != '\0'; ++i)
    {
        char caracter = cuvant[i];

        if(aux->copil.find(caracter) == aux->copil.end())
            return 0;

        aux = aux->copil.at(caracter);
    }

    return aux->contor;
}


int lungime_maxima_prefix(char* cuvant)
{
    Node* aux = trie;

    int i;

    for(i = 0; cuvant[i] != '\0'; ++i)
    {
        char caracter = cuvant[i];

        if(aux->copil.find(caracter) == aux->copil.end())
            return i;

        aux = aux->copil.at(caracter);
    }

    return i;
}

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

    int op;
    char* cuvant = new char[21];

    while(fin >> op >> cuvant)
    {
        switch(op)
        {
        case 0:
            adauga(cuvant);
            break;
        case 1:
            sterge(cuvant);
            break;
        case 2:
            fout << numar_aparitii(cuvant) << '\n';
            break;
        case 3:
            fout << lungime_maxima_prefix(cuvant) << '\n';
            break;
        }
    }
}