Cod sursa(job #3210009)

Utilizator vladdobro07vladdd vladdobro07 Data 4 martie 2024 12:21:31
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.26 kb
#include <bits/stdc++.h>

using namespace std;

struct Node {

        int apar=0,cuv=0;
        vector<Node *> fii;

        Node() {
                fii.resize(26,nullptr);
        }

};

struct Trie {

        Node * root = nullptr;

        Node * insert_(Node * node, const char * s) {

                if(node == nullptr)
                        node = new Node;

                (* node).apar++;
                if(s[0]=='\0')
                        (* node).cuv++;
                else
                        (* node).fii[s[0]-'a'] = insert_(node->fii[s[0]-'a'], s+1);

                return node;
        }

        Node * delete_(Node * node, const char * s) {

                if(node == nullptr)
                        return node;

                (* node).apar--;
                if(s[0]=='\0')
                        (* node).cuv++;
                else
                        (* node).fii[s[0]-'a'] = delete_(node->fii[s[0]-'a'], s+1);

                return node;
        }

        int query_apar(Node * node, const char * s){

                if(node == nullptr)
                        return 0;

                if(s[0]=='\0')
                        return (* node).cuv;
                else
                        return query_apar(node->fii[s[0]-'a'], s+1);
        }

        int query_pref(Node * node, const char * s){

                if(node == nullptr)
                        return 0;

                if(s[0]=='\0' || (* node).fii[s[0]-'a'] == nullptr)
                        return 0;
                else
                        return (query_pref(node->fii[s[0]-'a'], s+1)+1);
        }

};

Trie trie;
string cuv;
int op;

int main() {

        while(cin>>op) {
                cin>>cuv;

                if(op==0) {
                        trie.root = trie.insert_(trie.root, cuv.c_str());
                } else if(op==1) {
                        trie.root = trie.delete_(trie.root, cuv.c_str());
                } else if(op==2) {
                        cout<<trie.query_apar(trie.root, cuv.c_str())<<"\n";
                } else if(op==3) {
                        cout<<trie.query_apar(trie.root, cuv.c_str())<<"\n";
                }

        }

        return 0;
}