Cod sursa(job #1918639)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 9 martie 2017 16:19:15
Problema Trie Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <cstring>

using namespace std;

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

char s[30];

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

void add(trie *t, char *k) {
    while (*k >= 'a') {
        int c = *k-'a';
        if (t -> fii[c] == 0)
            t -> fii[c] = new trie, t -> nfii++;
        t = t->fii[c];
        k++;
    }
    t -> cnt++;
}

bool delet(trie *t, char *k) {
    int c = *k-'a';

    if (*k < 'a' && t -> cnt > 0)
        t -> cnt--;
    else if (t -> fii[c] && delet(t -> fii[c], k+1)) {
        t -> nfii--;
        t -> fii[c] = 0;
    }
    if (t != inc && t -> nfii == 0 && t -> cnt == 0) {
        delete t;
        return 1;
    }

    return 0;
}

int q1(trie *t, char *k) {
    int c = *k-'a';
    if (*k < 'a')
        return t -> cnt;
    if (*k >= 'a')
        if(t-> fii[c])
            return q1(t->fii[c], k+1);
    return 0;
}

int q2(trie *t, char *k) {
    //g << k << ' ';
    int c = *k-'a';
    if (t -> fii[c])
        return q2(t -> fii[c], k+1)+1;
    return 0;
}

int main() {
    inc = new trie;
    while (f.getline(s,sizeof(s))) {
            //g << s << ' ';
        if (*s == '0')
            add(inc, s+2);
        else if (*s == '1')
            delet(inc, s+2);
        else if (*s == '2')
            g << q1(inc, s+2) << '\n';
        else if (*s == '3')
            g << q2(inc, s+2) << '\n';
    }
    return 0;
}