Cod sursa(job #3004999)

Utilizator vlad_maneaManea Vlad Cristian vlad_manea Data 16 martie 2023 18:44:23
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

struct nod {
    int nr_ap=0;
    int nr_cuv=0;
    vector<nod *> fii;

    nod() {
        fii.resize(26, 0);
    }
} *r;

nod *trie_insert(nod *r, char *s) {
    if (!r)
        r=new nod;
    r->nr_ap++;
    if (s[0]=='\0')
        r->nr_cuv++;
    else
        r->fii[s[0]-'a']=trie_insert(r->fii[s[0]-'a'], s+1);
    return r;
}

nod *trie_delete(nod *r, char *s) {
    if (!r)
        return r;
    r->nr_ap--;
    if (s[0]=='\0')
        r->nr_cuv--;
    else
        r->fii[s[0]-'a']=trie_delete(r->fii[s[0]-'a'], s+1);
    if (!r->nr_ap) {
        delete r;
        r=0;
    }
    return r;
}

int aparitii(nod *r, char *s) {
    if (!r)
        return 0;
    if (s[0]=='\0')
        return r->nr_cuv;
    else
        return aparitii(r->fii[s[0]-'a'], s+1);

}

int pref_max(nod *r, char *s) {
    if (!r)
        return 0;
    if (s[0]=='\0' || !r->fii[s[0]-'a'])
        return 0;
    else
        return pref_max(r->fii[s[0]-'a'], s+1)+1;
}

void citire() {
    int op;
    char s[25];
    while (fin>>op) {
        fin>>s;
        if (op==0)
            r=trie_insert(r, s);
        else if (op==1)
            r=trie_delete(r, s);
        else if (op==2)
            fout<<aparitii(r, s)<<"\n";
        else
            fout<<pref_max(r, s)<<"\n";
    }
}

int main() {
    citire();
    return 0;
}