Cod sursa(job #1720702)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 23 iunie 2016 10:24:27
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <cstring>
#include <iostream>
#define cat *k - 'a'

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

struct trie{
    int nfii = 0, nap = 0;
    trie *vec[30];
    trie(){
        memset(vec, 0, sizeof(vec));
    }
};

trie *inc = new trie;

void adauga(trie *t, char *k){
    if (!(*k >= 'a' && *k <= 'z')){
        t -> nap ++;
        return;
    }
    if (t -> vec[cat] == 0){
        t -> vec[cat] = new trie;
        t -> nfii++;
    }

    adauga(t -> vec[cat], k+1);
}

bool sterge(trie *t, char *k){
    if (!(*k >= 'a' && *k <= 'z')){
        t -> nap--;
    }
    else if (sterge(t -> vec[cat], k+1)){
        t -> vec[cat] = 0;
        t -> nfii--;
    }
    if (t -> nfii == 0 && t -> nap == 0 && t != inc){
        delete t;
        return 1;
    }

    return 0;
}

int na(trie *t, char *k){
    if (!(*k >= 'a' && *k <= 'z'))
        return t -> nap;
    return na (t -> vec[cat], k+1);
}

int lp(trie *t, char *k, int H){
    if (!(*k >= 'a' && *k <= 'z') || t -> vec[cat] == 0)
        return H;

    if (t -> vec[cat])
        return lp(t -> vec[cat], k+1, H+1);
    return 0;
}

int main(){
    char s[100];
    while (f.getline(s, sizeof(s))){
        if (s[0] == '0')
            adauga(inc, s+2);
        else if (s[0] == '1')
            sterge(inc, s+2);
        else if (s[0] == '2')
            g << na(inc, s+2) << '\n';
        else if (s[0] == '3')
            g << lp(inc, s+2, 0) << '\n';
    }
    return 0;
}