Cod sursa(job #2521996)

Utilizator maria15Maria Dinca maria15 Data 11 ianuarie 2020 19:55:56
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>

using namespace std;

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

int n, i = 0;
char s[26], op;

struct nod{
    int NrFii;
    int NrCuvinte;
    int NrPrefixe;
    nod *Fiu[26];
    nod(){
        NrFii = 0;
        NrCuvinte = 0;
        NrPrefixe = 0;
        for(int i = 0;i<26;i++)
            Fiu[i] = 0;
    }
};

nod *rad = new nod;

void adaugare(char *s, nod *p){
    ///daca mai am vreun caracter din cuvant de adaugat in lista
    if(*s != 0){
        int litera = *s - 'a';
        if(p->Fiu[litera] == NULL){
            p->Fiu[litera] = new nod;
            p->NrFii++;
        }
        p->Fiu[litera]->NrPrefixe++;
        adaugare(s+1, p->Fiu[litera]);
    }
    else
        p->NrCuvinte++;
}

void sterge(char *s, nod *p){
    /*int litera = *s-'a';
    if(*(s+1) != 0)
        sterge(s+1, p->Fiu[litera]);
    p->Fiu[litera]->NrPrefixe--;
    if(*(s+1) == 0)
        p->Fiu[litera]->NrCuvinte--;
    if(p->Fiu[litera]->NrPrefixe == 0){
        delete p;
        return;
    }*/
    p->NrPrefixe--;
    if(*s == 0){
        p->NrCuvinte--;
    }
    else{
        int litera = *s-'a';
        sterge(s+1, p->Fiu[litera]);
        if(p->Fiu[litera]->NrPrefixe == 0)
            p->Fiu[litera] = NULL;
    }
}

int aparitii(char *s, nod *p){
    if(*s != 0){
        int litera = *s - 'a';
        if(p->Fiu[litera] == NULL)
            return 0;
        return aparitii(s+1, p->Fiu[litera]);
    }
    return p->NrCuvinte;
}

int prefix(char *s, nod *p, int nr){
    int litera = *s - 'a';
    if(litera < 0 || p->Fiu[litera] == NULL)
        return nr;
    return prefix(s+1, p->Fiu[litera], nr+1);
}

int main(){
    while(fin>>op){
        fin>>s;
        if(op == '0')
            adaugare(s, rad);
        if(op == '1')
            sterge(s, rad);
        if(op == '2')
            fout<<aparitii(s, rad)<<"\n";
        if(op == '3')
            fout<<prefix(s, rad, 0)<<"\n";
    }

    return 0;
}