Cod sursa(job #2152863)

Utilizator andra_moldovanAndra Moldovan andra_moldovan Data 5 martie 2018 20:39:27
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
#include <memory.h>

using namespace std;

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

struct trie{
    int cnt = 0, nrfii;

    trie *fiu[27];

    trie() {
        cnt = nrfii = 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] == NULL) {
        node->nrfii++;
        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->nrfii == 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->nrfii--;

        if (node->nrfii == 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';
    return Query(node->fiu[delta], s + 1);
}

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

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

void Read() {
    int tip; char s[24];

    fin >> tip >> s;

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

        fin >> tip >> s;
    }
}

int main () {
    Read();

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