Cod sursa(job #1017495)

Utilizator dunhillLotus Plant dunhill Data 27 octombrie 2013 20:15:13
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <fstream>
#include <cstring>
using namespace std;

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

int i, n, N;
int op;

char w[21];

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

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

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

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

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

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

int main() {
    init(root);
    while (!fin.eof()) {
        if (!(fin >> op))
            break;
        fin >> w;
        n = strlen(w);
        if (!op) {
            insert(root, w, n);
            continue;
        }
        if (op == 1) {
            erase(0, root);
            continue;
        }
        if (op == 2) {
            printf ("%d\n", nrAparitii(root, w, n));
            continue;
        }
        if (op == 3) {
            printf ("%d\n", prefix(root, w, n));
            continue;
        }
    }
    return 0;
}