Cod sursa(job #2092055)

Utilizator CammieCamelia Lazar Cammie Data 20 decembrie 2017 21:23:42
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <fstream>

#define NIL 0

using namespace std;

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

char cuv[25];
int delta;

struct trie {
    int cnt = 0, nrs = 0;

    trie *fiu[27] = {0};
};

trie *root = new trie();

inline void Add(trie *node, char *s) {
    if (*s == 0) {
        node->cnt++;
        return;
    }

    delta = *s - 'a';

    if (node->fiu[delta] == NIL) {
        node->nrs++;
        node->fiu[delta] = new trie();
    }

    Add(node->fiu[delta], s + 1);
}

inline int Delete(trie *node, char *s) {
    if (*s == 0) {
        node->cnt--;

        if (node->cnt == 0 && node->nrs == 0) {
            delete node;
            return 1;
        }
        return 0;
    }

    delta = *s - 'a';

    if (Delete(node->fiu[delta], s + 1)) {
        node->fiu[delta] = 0;
        node->nrs--;
    }

    if (node->nrs == 0 && node->cnt == 0 && node != root) {
        delete node;
        return 1;
    }
    return 0;
}

inline int Query(trie *node, char *s) {
    if (*s == 0) {
        return node->cnt;
    }

    delta = *s - 'a';

    if (node->fiu[delta] == NIL)
        return 0;
    return Query(node->fiu[delta], s + 1);
}

inline int Prefix(trie *node, char *s) {
    if (*s == 0)
        return 0;
    delta = *s - 'a';

    if (node->fiu[delta] != NIL) {
        return Prefix(node->fiu[delta], s + 1) + 1;
    }
    return 0;
}

inline void Read() {
    int tip;

    fin >> tip >> cuv;

    while (!fin.eof()) {
        if (tip == 0) {
            Add(root, cuv);
        }
        else if (tip == 1) {
            delta = Delete(root, cuv);
        }
        else if (tip == 2) {
            fout << Query(root, cuv) << "\n";
        }
        else {
            fout << Prefix(root, cuv) << "\n";
        }

        fin >> tip >> cuv;
    }
}

int main () {
    Read();

    fin.close(); fout.close(); return 0;
}