Cod sursa(job #1645777)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 10 martie 2016 13:44:11
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include <cstring>

using namespace std;
struct Trie{
    int nr, nf;
    Trie *Sons[26];
    Trie(){
        nr = nf = 0;
        memset(Sons, 0, sizeof(Sons));
    }
};

Trie *Nod = new Trie;

void add(Trie *T, char *s){
    if(*s == 0)
        ++T->nr;
    else
        if(T->Sons[*s - 'a'] == 0){
            T->Sons[*s - 'a'] = new Trie;
            ++T->nf;
            add(T->Sons[*s - 'a'], s + 1);
        }
        else
            add(T->Sons[*s - 'a'], s + 1);
}

int query(Trie *T, char *s){
    if(*s == 0)
        return T->nr;
    else
        if(T->Sons[*s - 'a'])
            return query(T->Sons[*s - 'a'], s + 1);
    return 0;
}

int del(Trie *T,char *s){
    if(*s == 0)
        --T->nr;
    else
        if(del(T->Sons[*s - 'a'], s + 1)){
            T->Sons[*s - 'a'] = 0;
            --T->nf;
        }
    if(T->nr == 0 && T->nf == 0 && T != Nod){
        delete T;
        return 1;
    }
    return 0;
}

int solve(Trie *T,char *s){
    if(*s == 0 || T->Sons[*s - 'a'] == 0)
        return 0;
    else
        return 1 + solve(T->Sons[*s - 'a'], s + 1);
}

int main(){
    char s[37];
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    while(gets(s)){
        if(s[0] == '0')
            add(Nod, s + 2);
        if(s[0] == '1')
            del(Nod, s + 2);
        if(s[0] == '2')
            printf("%d\n", query(Nod, s + 2));
        if(s[0] == '3')
            printf("%d\n", solve(Nod, s + 2));
    }
    return 0;
}