Cod sursa(job #1479811)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 1 septembrie 2015 13:38:36
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include<fstream>
using namespace std;
int t;
char s[25];
struct nod{
    int nr;
    int nf;
    nod *v[26];
    nod(){
        nr = nf = 0;
        for(int i = 0; i < 26; i++){
            v[i] = NULL;
        }
    }
};
nod *p;
ifstream fin("trie.in");
ofstream fout("trie.out");
void adauga(char *s, nod *r){
    if(*s == 0){
        r->nr++;
    }
    else{
        if(r->v[*s - 'a'] == NULL){
            r->v[*s - 'a'] = new nod;
            r->nf++;
        }
        adauga(s + 1, r->v[*s - 'a']);
    }
}

int aparitii(char *s, nod *r){
     if(r == NULL){
        return 0;
    }
    else{
        if(*s == 0){
           return r->nr;
        }
        else{
            return aparitii(s + 1, r->v[*s - 'a']);
        }
    }
}

int prefixe(char *s, nod *r){
     if(r == NULL){
        return -1;
    }
    else{
        if(*s == 0){
           return 0;
        }
        else{
            return 1 + prefixe(s + 1, r->v[*s - 'a']);
        }
    }
}

int stergere(char *s, nod *&r){
    if(*s == 0){
        r->nr--;
        if(r != p && r->nr == 0 && r->nf == 0){
            delete r;
            r = NULL;
            return 1;
        }
        else{
            return 0;
        }
    }
    else{
        int re = stergere(s + 1, r->v[*s - 'a']);
        if(re == 1){
            r->nf--;
            if(r != p && r->nr == 0 && r->nf == 0){
                delete r;
                r = NULL;
                return 1;
            }
            else{
                return 0;
            }
        }
        else{
            return 0;
        }
    }
}

int main(){
    p = new nod;
    while(fin>> t >> s){
        if(t == 0){
            adauga(s, p);
        }
        else{
            if(t == 1){
                stergere(s, p);
            }
            else{
                if(t == 2){
                    fout<< aparitii(s, p) <<"\n";
                }
                else{
                    fout<< prefixe(s, p) <<"\n";
                }
            }
        }
    }
    return 0;
}