Cod sursa(job #3210239)

Utilizator vladdobro07vladdd vladdobro07 Data 5 martie 2024 16:56:22
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.46 kb
#include <bits/stdc++.h>

using namespace std;

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

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) {

                cout<<"insert "<<s<<"\n";

                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) {

                cout<<"delete "<<s<<"\n";

                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){

                cout<<"apar "<<s<<"\n";

                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){

                cout<<"pref "<<s<<"\n";

                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(fin>>op) {
                fin>>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) {
                        fout<<trie.query_apar(trie.root, cuv.c_str())<<"\n";
                } else if(op==3) {
                        fout<<trie.query_pref(trie.root, cuv.c_str())<<"\n";
                }

        }

        return 0;
}