Cod sursa(job #2814154)

Utilizator Albert_GAlbert G Albert_G Data 7 decembrie 2021 17:39:21
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.17 kb
#include <fstream>
#include <vector>

std::ifstream in("trie.in");
std::ofstream out("trie.out");

class Node{
public:
    int nr_ap=0;
    int nr_ends=0;
    Node* fii[26] {nullptr};
};


class Trie{
    Node* root = new Node;
public:
    void insert(char *s){
        root = insert_(s, root);
    }
    void erase(char *s){
        root = erase_(s, root);
    }
    int query_prefix(char *s, Node* node);
    int query_cuv(char *s, Node* node);
    Node* get_root(){
        return root;
    }
private:
    Node* insert_(char *s, Node* node);
    Node* erase_(char *s, Node* node);
};

Node* Trie::insert_(char *s, Node* node){
    if(node == nullptr){
        node = new Node;
    }
    ++node->nr_ap;
    if(*s == '\0'){
        ++node->nr_ends;
        return node;
    }
    else{
        node->fii[*s - 'a'] = insert_(s+1, node->fii[*s - 'a']);
    }
    return node;
}

Node* Trie::erase_(char *s, Node* node){
    if(node == nullptr){
        return node;
    }
    node->nr_ap--;
    if(*s == '\0'){
        --node->nr_ends;
    }
    else{
        node->fii[*s - 'a'] = erase_(s+1, node->fii[*s - 'a']);
    }
    if(node->nr_ap == 0){
        delete node;
        node = nullptr;
    }
    return node;
}

int Trie::query_prefix(char *s, Node* node){
    if(*s == '\0' || node == nullptr || node->fii[*s - 'a'] == nullptr) return 0;
    return query_prefix(s+1, node->fii[*s - 'a']) + 1;
}

int Trie::query_cuv(char *s, Node* node){
    if(node == nullptr){
        return 0;
    }
    else if(*s == '\0'){
        return node->nr_ends;
    }
    else{
        return query_cuv(s+1, node->fii[*s - 'a']);
    }
}

Trie v;
char cuv[21];

int main()
{
    int type;
    while(true){
        in >> type >> cuv;
        if(in.eof()) break;
        switch(type){
        case 0:
            v.insert(cuv);
            break;
        case 1:
            v.erase(cuv);
            break;
        case 2:
            out << v.query_cuv(cuv, v.get_root()) << '\n';
            break;
        case 3:
            out << v.query_prefix(cuv, v.get_root()) << '\n';
            break;

        }
    }
    return 0;
}