Cod sursa(job #2971879)

Utilizator gabriel10tm@gmail.comGabriel Marian [email protected] Data 28 ianuarie 2023 11:16:22
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
#include <string>
using namespace std;
#if 1
ifstream fin("trie.in");
ofstream fout("trie.out");
#define cin fin
#define cout fout
#endif // 0
struct Tre{
    int ap = 0;
    int nrfi=0;
    Tre* fi[26]{};
    void addSon(char* c){
        if(!*c){
            ap++;
            return;
        }
        int let = *c-'a';
        if(fi[let]==0){
            nrfi++;
            fi[let] = new Tre();
        }
        fi[let]->addSon(c+1);
    }

    void eraseSon(char * c){
        if(!*c){
            ap--;
            return;
        }
        int let = *c - 'a';
        fi[let]->eraseSon(c+1);
        if(fi[let]->nrfi==0 && fi[let]->ap==0){
            delete fi[let];
            nrfi--;
            fi[let] = 0;
        }
    }

    int nrap(char* c){
        if(*c==0)
            return ap;
        int let = *c - 'a';
        if(fi[let]==0)
            return 0;
        return fi[let]->nrap(c+1);
    }

    int prefix(char* c){
        if(*c==0)
            return 0;
        int let =*c-'a';
        if(fi[let]==0)
            return 0;
        return fi[let]->prefix(c+1) + 1;
    }

};

Tre rad;
int main(){
    int op;
    string str;
    while(cin >> op >> str){
        if(op==0){
            rad.addSon(&str[0]);
        }
        else if(op == 1){
            rad.eraseSon(&str[0]);
        }
        else if(op == 2){

            cout << rad.nrap(&str[0]) << "\n";
        }
        else if(op == 3){
            cout << rad.prefix(&str[0]) << "\n";
        }
    }

}