Cod sursa(job #3363292)

Utilizator DasapSapunaru Daniel Dasap Data 15 august 2026 16:38:32
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
    int nrCuv,nrAp;
    Trie *fii[26];
    Trie() {
        nrCuv=nrAp=0;
        for(int i=0; i<26; i++)fii[i]=nullptr;
    }

    void addWord(const string &s,int poz=0) {
        int c=s[poz]-'a';
        if(fii[c]==nullptr)fii[c]=new Trie();
        fii[c]->nrAp++;
        if(poz==s.size()-1)fii[c]->nrCuv++;
        else fii[c]->addWord(s,poz+1);
    }

    void deleteWord(const string &s,int poz=0) {
        int c=s[poz]-'a';
        fii[c]->nrAp--;
        if(poz==s.size()-1)fii[c]->nrCuv--;
        else fii[c]->deleteWord(s,poz+1);
        if(fii[c]->nrAp==0) {
            delete fii[c];
            fii[c]=nullptr;
        }
    }

    int countAp(const string &s,int poz=0){
        int c=s[poz]-'a';
        if(fii[c]==nullptr)return 0;
        if(poz==s.size()-1)return fii[c]->nrCuv;
        return fii[c]->countAp(s,poz+1);
    }

    int longestPrefix(const string &s,int poz=0){
        int c=s[poz]-'a';
        if(fii[c]==nullptr)return 0;
        if(poz==s.size()-1)return 1;
        return 1+fii[c]->longestPrefix(s,poz+1);
    }
};
int main() {
    int op;
    string s;
    Trie T;
    while(fin>>op>>s){
        if(op==0)T.addWord(s);
        else if(op==1)T.deleteWord(s);
        else if(op==2)fout<<T.countAp(s)<<'\n';
        else fout<<T.longestPrefix(s)<<'\n';
    }
    return 0;
}