Cod sursa(job #2031931)

Utilizator cristina_borzaCristina Borza cristina_borza Data 4 octombrie 2017 08:11:13
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f ("trie.in");
ofstream g ("trie.out");

const int Dim = 2e5;

char s[ Dim ];
int type;

struct Trie {
    int nrf, cnt;
    Trie *fii[ 26 ];

    Trie () {
        cnt = nrf = 0;
        memset (fii, 0, sizeof (fii));
    }
};

Trie *Root = new Trie;

void adauga (Trie *node, char *s) {
    if (*s == '\0') {
        node -> cnt++;
        return;
    }

    int ch = *s - 'a';
    if (node -> fii[ ch ] == NULL) {
        node -> fii[ ch ] = new Trie;
        node -> nrf ++;
    }

    adauga (node -> fii[ ch ], s + 1);
}

bool scoate (Trie *node, char *s) {
    int ch = *s - 'a';
    if (*s == '\0') {
        node -> cnt --;
    }

    else {
        if (scoate (node -> fii[ ch ], s + 1)) {
            node -> fii[ ch ] = NULL;
            node -> nrf --;
        }
    }

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

    return 0;
}

int nrap (Trie *node, char *s) {
    if (*s == '\0') {
        return node -> cnt;
    }

    int ch = *s - 'a';
    if (node -> fii[ ch ] != NULL) {
        return nrap (node -> fii[ ch ], s + 1);
    }

    return 0;
}


int prefix (Trie *node, char *s, int lg) {
    if (*s == '\0') {
        return lg;
    }

    char ch = *s - 'a';
    if (node -> fii[ ch ] != NULL) {
        return prefix (node -> fii[ ch ], s + 1, lg + 1);
    }

    return lg;
}

int main() {
    while (f >> type) {
        f >> s;
        if (type == 0) {
            adauga (Root, s);
        }

        if (type == 1) {
            scoate (Root, s);
        }

        if (type == 2) {
            g << nrap (Root, s) << '\n';
        }

        if (type == 3) {
            g << prefix (Root, s, 0) << '\n';
        }
    }
    return 0;
}