Cod sursa(job #1479396)

Utilizator mariusn01Marius Nicoli mariusn01 Data 31 august 2015 11:22:23
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>

using namespace std;

struct nod {
    int nr, nf;
    nod *v[26];

    nod (){
        nr = 0;
        nf = 0;
        for (int i=0;i<26;i++)
            v[i] = NULL;
    }

};

char s[22];
nod *rad;

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

void inserare(nod *r, char *s) {
    if (*s != 0) {
        if (r->v[*s-'a'] == NULL) {
            r->v[*s-'a'] = new nod;
            r->nf++;
        }
        inserare(r->v[*s-'a'], s+1);
    } else
        r->nr++;

}

int aparitii(nod *r, char *s) {

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

int prefix(nod *r, char *s) {

    if (r == 0) {
        return -1;
    }
    else
        if (*s == 0) {
            return 0;
        } else {
            return 1 + prefix(r->v[*s-'a'], s+1);
        }
}

int stergere(nod *&r, char *s) {
    if (*s == 0){
        r->nr--;

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

            } else
                return 0;
        } else
            return 0;
    }
}


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

    }

    return 0;
}