Cod sursa(job #1862135)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 29 ianuarie 2017 15:56:10
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <cstring>
#define B *s-'a'

using namespace std;

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

struct trie {
    int nfii, cnt;
    trie *fii[30];
    trie() {
        nfii=cnt=0;
        memset(fii,0,sizeof(fii));
    }
};
trie *inc=new trie;
char s[40];

void adaug(trie *t, char *s) {
    if (*s < 'a') {
        t -> cnt++;
        return;
    }
    if (t->fii[B]==0)
        t -> fii[B] = new trie,t->nfii++;
    adaug(t->fii[B],s+1);
}

bool sterg(trie *t, char *s) {
    if (*s<'a'&&t->cnt)
        t->cnt--;
    else if (t->fii[B]&&sterg(t->fii[B],s+1)) {
        t->fii[B]=0;
        t -> nfii--;
    }
    if (t->cnt==0&&t->nfii==0) {
        delete t;
        return 1;
    }
    return 0;

}

int query1(trie *t, char *s) {
    if (*s < 'a') {
        return t -> cnt;
    }
    if (t -> fii[B])
        return query1(t->fii[B], s+1);
    return 0;
}

int query2(trie *t, char *s,int K) {
    if (*s<'a')
        return K;
    if (t -> fii[B])
        return query2(t->fii[B],s+1,K+1);
    return K;
}

int main() {
    while (f.getline(s, sizeof(s))) {
        if (s[0] == '0')
            adaug(inc,s+2);
        else if (s[0] == '1')
            sterg(inc,s+2);
        else if (s[0] == '2')
            g << query1(inc,s+2)<<'\n';
        else
            g << query2(inc,s+2,0)<<'\n';
    }

    return 0;
}