Cod sursa(job #1720693)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 23 iunie 2016 09:51:22
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <iostream>
#include <cstring>

using namespace std;

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

struct trie{
    int nnod, nap;

    trie *vec[30];

    trie(){
        nnod = nap = 0;
        memset(vec, 0, sizeof(vec));
    }
};

trie *inc = new trie;

void adauga(trie *T, char *k){
    int care = *k - 'a';
    if (!(*k >= 'a' && *k <= 'z')){
        T -> nap++;
        return;
    }

    if (T -> vec[care] == 0){
        T -> vec[care] = new trie;
        T -> nnod++;
    }
    adauga(T -> vec[care], k+1);
}

bool sterge(trie *T, char *k){
    int care = *k - 'a';
    if (!(*k >= 'a' && *k <= 'z'))
        T -> nap--;
    else if (sterge(T -> vec[care], k+1)) {
            T -> vec[care] = 0;
            T -> nnod--;
    }

    if( T -> nnod == 0 && T -> nap == 0 && inc != T ) {
        delete T;
        return 1;
    }
    return 0;
}

int Lprefix(trie *T, char *k, int P){
    int care = *k - 'a';
    if (T -> vec[care] == 0 || !(*k >= 'a' && *k <= 'z'))
        return P;

    Lprefix(T -> vec[care], k+1, P+1);
}

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

int main(){
    char s[400];
    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 << nrap(inc, s+2) << '\n';
        else if (s[0] == '3'){
            g << Lprefix(inc, s+2, 0) << '\n';
        }
    }
    return 0;
}