Cod sursa(job #1218303)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 10 august 2014 13:58:49
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>

using namespace std;

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

char line[55];

struct trie {
    int nr;
    int fii;
    trie *fiu[26];
    trie () {
        nr = fii = 0;
        for (int i=0; i<26; ++i)
            fiu[i] = NULL;
    }
} *T = new trie;

void Update (trie *nod, char *s) {
    if (*s == 0) {
        ++nod->nr;
        return;
    }
    if (nod->fiu[*s - 'a'] == NULL) {
        nod->fiu[*s - 'a'] = new trie;
        ++nod->fii;
    }
    Update (nod->fiu[*s - 'a'], s+1);
}

bool Delete (trie *nod, char *s) {
    if (*s == 0)
        --nod->nr;
    else
    if (Delete (nod->fiu[*s - 'a'], s+1)) {
        --nod->fii;
        nod->fiu[*s - 'a'] = NULL;
    }
    if (nod->fii == 0 && nod->nr == 0 && nod != T) {
        delete nod;
        return 1;
    }
    return 0;
}

int Query1 (trie *nod, char *s) {
    if (*s == 0)
        return nod->nr;
    if (nod->fiu[*s - 'a'] != NULL)
        return Query1(nod->fiu[*s - 'a'], s+1);
    return 0;
}

int Query2 (trie *nod, char *s, int k) {
    if (*s == 0)
        return k;
    if (nod->fiu[*s - 'a'] != NULL)
        return Query2 (nod->fiu[*s - 'a'], s+1, k+1);
    return k;
}

int main () {
    while ( f.get(line, 50) ) {
        if (line[0] == '0')
            Update (T, line+2);
        else
        if (line[0] == '1')
            Delete (T, line+2);
        else
        if (line[0] == '2')
            g << Query1 (T, line+2) << "\n";
        else
        if (line[0] == '3')
            g << Query2 (T, line+2, 0) << "\n";
        f.get ();
    }
    return 0;
}