Cod sursa(job #2008079)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 5 august 2017 11:58:19
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <cstdio>
#include <cstring>
#include <iostream>
#include <fstream>

using namespace std;

struct Trie{
    Trie *fii[26];
    int nrfii;
    int nrcuv;

    Trie() {
        nrfii = nrcuv = 0;
        memset(fii, 0, sizeof(fii));
    }
};

Trie *radacina = new Trie;

void add(Trie *rad, char *c){
    int lg = strlen(c);
    for(int i = 0; i < lg; ++i){
        if(rad->fii[c[i] - 'a'] == 0){
            rad->fii[c[i] - 'a'] = new Trie;
            rad->nrfii++;
        }
        rad = rad->fii[c[i] - 'a'];
    }
    rad->nrcuv++;
}

bool del(Trie *rad, char *c){
    if (*c == 0) {
        rad->nrcuv--;
        if (rad->nrcuv == 0 && rad->nrfii == 0)
            return true;
        return false;
    }

    if (rad->fii[*c - 'a'] == 0) {
        return false;
    }

    if (del(rad->fii[*c - 'a'], c + 1) == true) {
        delete rad->fii[*c - 'a'];
        rad->fii[*c - 'a'] = NULL;
        rad->nrfii--;
    }

    if (rad->nrcuv == 0 && rad->nrfii == 0) {
        return true;
    }
    return false;
}

int nrAp(Trie *rad, char *c){
    int lg = strlen(c);
    for(int i = 0; i < lg; ++i){
        if(rad->fii[c[i] - 'a'] == 0){
          return 0;
        }
        rad = rad->fii[c[i] - 'a'];
    }
    return rad->nrcuv;
}

int lcmmpc(Trie *rad, char *c){
    int lg = strlen(c);
    for(int i = 0; i < lg; ++i){
        if(rad->fii[c[i] - 'a'] == 0){
            return i;
        }
        rad = rad->fii[c[i] - 'a'];
    }
    return lg;
}

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

    int op;
    while(fin >> op){
        char cuv[25];
        fin >> cuv;

        if(op == 0){
            add(radacina, cuv);
        }
        else if(op == 1){
            del(radacina, cuv);
        }
        else if(op == 2){
            fout << nrAp(radacina, cuv) << '\n';
        }
        else {
            fout << lcmmpc(radacina, cuv) << '\n';
        }
    }
    return 0;
}