Cod sursa(job #2856430)

Utilizator qweryclujRadu Alexandru qwerycluj Data 23 februarie 2022 20:46:27
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
#include <bits/stdc++.h>

using namespace std;

struct Trie
{
    int incepute, terminate;
    //aici tin si caracterul urmator
    Trie* nod_next[26];

    Trie()
    {
        incepute = 0, terminate = 0;
        for(int i = 0; i < 26;i++)
        {
            nod_next[i] = nullptr;
        }
    }
};

void addword(char* word, Trie* trie)
{
    trie->incepute++;
    if(word[0] == 0)
    {
        //word ended
        trie->terminate++;
        return;
    }

    int ind = word[0] - 'a';

    //daca nu exista nodul, il cream
    if(trie->nod_next[ind] == nullptr)
    {
        trie->nod_next[ind] = new Trie;
    }

    //ne ducem la urmatorul
    addword(word + 1, trie->nod_next[ind]);
}


void rmvword(char* word, Trie* trie)
{
    //este garantat ca exista cuvantul in trie
    trie->incepute--;
    if(word[0] == 0)
    {
        //word ended
        trie->terminate--;
        return;
    }

    int ind = word[0] - 'a';

    rmvword(word + 1, trie->nod_next[ind]);
    // la intoarcere
    if(trie->nod_next[ind]->incepute == 0)
    {
        // stergem trie-ul pt ca nu avem nevoie de el
        delete trie->nod_next[ind];
        trie->nod_next[ind] = nullptr;
        return;
    }
}

int afisare_ap(char* word, Trie* trie)
{
    if(word[0] == 0)
    {
        return trie->terminate;
    }

    int ind = word[0] - 'a';
    if(trie->nod_next[ind] == nullptr)
    {
        return 0;
    }

    return afisare_ap(word + 1, trie->nod_next[ind]);
}

int afisare_lungime_pref(char *word, Trie* trie)
{
    if(trie->nod_next[word[0] - 'a'] == nullptr || *word == 0)
        return 0;
    return 1 + afisare_lungime_pref(word + 1, trie->nod_next[word[0] - 'a']);
}

int main()
{
    std::ifstream fin("trie.in");
    std::ofstream fout("trie.out");
    Trie start;
    int op;
    char word[30];
    char *p = word;
    while(fin >> op)
    {
        fin >> word;
        if(op == 0)
            addword(p, &start);
        else if(op == 1)
            rmvword(p, &start);
        else if(op == 2)
            fout << afisare_ap(p, &start) << "\n";
        else if(op == 3)
            fout << afisare_lungime_pref(p, &start) << "\n";
    }
}