Cod sursa(job #1110431)

Utilizator Theorytheo .c Theory Data 18 februarie 2014 02:26:29
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <cstdio>
#include <cstring>

using namespace std;

ifstream fin ("trie.in");
ofstream fout ("trie.out");

#define get_n(X) (X - 'a')

class Nod {

    public:

    int count;
    Nod *son[27];
    int sons;

    Nod() {
        count = sons = 0;
        memset(son, 0, sizeof(son));
    }
};


Nod* start = new Nod;

class Trie {

    public:

    void insert(Nod* X, char* p) {

        if(*p == '\0') {

            X -> count++;
            return ;
        }


        if(X -> son[get_n(*p)] == 0) {

            X -> son[get_n(*p)] = new Nod;
            X -> sons ++;
        }
        insert(X -> son[get_n(*p)], p + 1);
    }

    bool del(Nod * X, char *p) {
        if(*p == '\0') {
            X -> count--;
        } else if(del(X -> son[get_n(*p)], p + 1)) {

            X -> son[get_n(*p)] = 0;
            X -> sons --;
        }
        if( X -> sons == 0 && X -> count == 0  && X != start) {
            delete X; return true;
        }
        return false;
    }

    int frec(Nod *X, char *p) {
        if(*p == '\0')
            return X -> count;

        frec(X -> son[get_n(*p)], p + 1);
    }

    int prefix(Nod* X, char *p, int lev) {
        if(*p == '\0')
            return lev;
        if(X -> son[get_n(*p)] == 0)
            return lev;
        else return prefix(X -> son[get_n(*p)],p + 1, lev + 1);
    }

} T;

int main() {

    int type;  char s[30];
    while(fin >> type >> s + 1) {

        if(type == 0) T.insert(start, s + 1);
        if(type == 1) T.del(start, s + 1);
        if(type == 2) fout << T.frec(start, s + 1) << '\n';
        if(type == 3) fout << T.prefix(start, s + 1, 0) << '\n';
    }
    return 0;
}