Cod sursa(job #419261)

Utilizator Omega91Nicodei Eduard Omega91 Data 17 martie 2010 10:58:45
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>
#include <cstring>

using namespace std;

const int SIGMAX = 'z' - 'a' + 2;

class node {
    public:
    node* son[SIGMAX];
    int counter;
    char nrSons;
    node() {
        counter = nrSons = 0;
        memset(son,   0, sizeof(node*) * SIGMAX);
    }
};


class trie {
        node root;
        bool remRec(node*,const char*);
    public:
        trie() {root.counter = 1;};
        void add(char*);
        void remove(const char*);
        int count(char*);
        int maxPrefix(char*);
};

inline int cind1(const char x) { return x - 'a' + 1; }

void trie::add(char *w)
{
    node *cn = &root;
    for (; *w; ++w) {
        int i = cind1(*w);
        if (cn -> son[i] == NULL) {
            cn -> son[i] = new node;
            ++ cn->nrSons;
        }
        cn = cn -> son[i];
    }
    ++(cn -> counter);
}

bool trie::remRec(node *a, const char *w)
{
    if (!*w) -- a->counter;
    else if (remRec(a->son[cind1(*w)], w + 1)) {
        a -> son[cind1(*w)] =  NULL;
        -- a->nrSons;

    }
    if (! a->nrSons && ! a->counter) {
        delete a;
        return true;
    } else return false;
}

void trie::remove(const char *w)
{ remRec(&root, w); }

int trie::count(char *w)
{
    node *cn = &root;
    for (; *w && (cn = cn -> son[cind1(*w)]); ++w);
    if (cn == NULL) return 0;
    else return cn -> counter;
}

int trie::maxPrefix(char *w)
{
    node *cn = &root;
    int ans = 0;
    for (; *w && (cn = cn -> son[cind1(*w)]); ++w, ++ans);
    return ans;
}

int main()
{
    trie T;
    int op; char w[SIGMAX];
    ifstream f1("trie.in");
    freopen("trie.out", "w", stdout);
    while(f1 >> op >> w) {
        switch (op) {
            case 0: T.add(w); break;
            case 1: T.remove(w); break;
            case 2: printf("%d\n", T.count(w)); break;
            case 3: printf("%d\n", T.maxPrefix(w)); break;
        }
    }
    f1.close();
    return 0;
}