Cod sursa(job #2092105)

Utilizator CammieCamelia Lazar Cammie Data 20 decembrie 2017 23:51:59
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
#include <cstring>

#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];

    trie() {
        cnt = nrs = 0;

        memset(fiu, 0, sizeof(fiu));
    }
};

trie *root = new trie();

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

    int 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 && node != root) {
            delete node;
            return 1;
        }
        return 0;
    }

    int 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;
    }

    int 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) {
            int aux = 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;
}