Cod sursa(job #1019559)

Utilizator dunhillLotus Plant dunhill Data 31 octombrie 2013 14:38:11
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <cstring>
#include <cstdlib>
using namespace std;

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

int i, op, n;

char w[21];

struct nod {
    int ap;
    int erase_ap;
    nod *next[26];
};
nod *root, *T;

void init(nod *&root) {
    root = new nod;
    root->ap = 0;
    root->erase_ap = 0;
    memset(root->next, 0, sizeof(root->next));
}

void insert(nod *root, char a[], int n) {
    T = root;
    for (int i = 0; i < n; ++i) {
        if (T->next[a[i] - 'a'] == NULL)
            init(T->next[a[i] - 'a']);
        T = T->next[a[i] - 'a'];
        ++T->ap;
    }
    ++T->erase_ap;
}

void erase(nod *&T, int i) {
    if (i == n) {
        --T->erase_ap;
        --T->ap;
        if (T->ap == 0) {
            delete T;
            T = NULL;
        }
        return;
    }
    erase(T->next[w[i] - 'a'], i + 1);
    --T->ap;
    if (T->ap == 0) {
        delete T;
        T = NULL;
    }
}

int query(nod *root, char a[], int n) {
    T = root;
    for (int i = 0; i < n; ++i) {
        if (T->next[a[i] - 'a'] == NULL) return 0;
        T = T->next[a[i] - 'a'];
    }
    return T->erase_ap;
}

int prefix (nod *root, char a[], int n) {
    T = root;
    for (int i = 0; i < n; ++i) {
        if (T->next[a[i] - 'a'] == NULL)
            return i;
        T = T->next[a[i] - 'a'];
    }
    return n;
}

int main() {
    init(root);
    while (fin >> op) {
        fin >> w;
        n = strlen(w);
        if (!op)
            insert(root, w, n);
        if (op == 1)
            erase(root, 0);
        if (op == 2)
            fout << query(root, w, n) << '\n';
        if (op == 3)
            fout << prefix(root, w, n) << '\n';
    }
    return 0;
}