Cod sursa(job #3360690)

Utilizator laur838Me eidi laur838 Data 15 iulie 2026 22:52:38
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <bits/stdc++.h>

using namespace std;

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

struct Nod {
    Nod* litera[26]{};
    int aparitii=0;
};

class Trie {
    public:
    Nod* root=new Nod;
    
    
    void insert(const string& s) {
        Nod* t=root;
        for(auto ch:s) {
            int index=ch-'a';
            if(t->litera[index]==nullptr) {
                Nod* newLetter=new Nod();
                t->litera[index]=newLetter;
            }
            t=t->litera[index];
        }
        ++t->aparitii;
    }
    
    bool areCopil(Nod* target) {
        for(int i=0;i<26;++i)
        if(target->litera[i])
        return 1;
        return 0;
    }
    
    bool sterge(Nod* target,const string& s,int index) {
        if(target==nullptr) return 0;
        
        if(index==s.size()) {
            --target->aparitii;
            return !target->aparitii&&!areCopil(target);
        }
        
        int ch=s[index]-'a';
        
        if(sterge(target->litera[ch],s,index+1)) {
            delete target->litera[ch];
            target->litera[ch]=nullptr;
            
            return !target->aparitii&&!areCopil(target);
        }
        
        return 0;
    }
    
    void nrApariti(const string& s) {
        Nod* t=root;
        for(auto ch:s) {
            int index=ch-'a';
            if(t->litera[index]==nullptr) {
                fout<<"0\n";
                return;
            }
            t=t->litera[index];
        }
        fout<<t->aparitii<<'\n';
    }
    
    void prefix(const string& s) {
        Nod* t=root;
        int lungime=0;
        for(auto ch:s) {
            int index=ch-'a';
            if(t->litera[index]==nullptr) {
                fout<<lungime<<"\n";
                return;
            }
            t=t->litera[index];
            ++lungime;
        }
        fout<<lungime<<'\n';
    }
};

int main()
{
    Trie head;
    string s;
    char op;
    while(fin>>op>>s) {
        switch(op) {
            case '0':
            head.insert(s);
            break;
            case '1':
            head.sterge(head.root,s,0);
            break;
            case '2':
            head.nrApariti(s);
            break;
            default:
            head.prefix(s);
        }
    }

    return 0;
}