Cod sursa(job #575721)

Utilizator bixcabc abc bixc Data 8 aprilie 2011 17:59:18
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <algorithm>
using namespace std;

#define Lmax 22

struct Trie {

    int nrfii, nrcuv;
    Trie *fii[26];

    Trie () {
        nrfii = nrcuv = 0;
        memset (fii, NULL, sizeof (fii));
    }
} *R;

char cuv[Lmax];

void adauga (Trie *nod, char *cuv) {

    if (*cuv == '\n') {
        nod->nrcuv++;
        return ;
    }

    if (nod->fii[*cuv - 'a'] == NULL) {
        nod->nrfii++;
        nod->fii[*cuv - 'a'] = new Trie ();
    }

    adauga (nod->fii[*cuv - 'a'], cuv + 1);
}

int sterge (Trie *nod, char *cuv) {

    if (*cuv == '\n') {
        nod->nrcuv--;
        if (nod->nrcuv == 0 && nod->nrfii == 0) {
            delete nod;
            return 1;
        }

        return 0;
    }

    if (nod->fii[*cuv - 'a'] == NULL) return 0;

    if (sterge (nod->fii[*cuv - 'a'], cuv + 1)) {
        nod->fii[*cuv - 'a'] = NULL;
        nod->nrfii--;
        if (nod != R && nod->nrfii == 0 && nod->nrcuv == 0) {
            delete nod;
            return 1;
        }
    }

    return 0;
}

int aparitii (Trie *nod, char *cuv) {

    if (*cuv == '\n') {
        return nod->nrcuv;
    }

    if (nod->fii[*cuv - 'a'] == NULL) return 0;
    return aparitii (nod->fii[*cuv - 'a'], cuv + 1);
}

int prefix (Trie *nod, char *cuv, int len) {

    if (*cuv == '\n')
        return len;

    if (nod->fii[*cuv - 'a'] == NULL) return len;
    return prefix (nod->fii[*cuv - 'a'], cuv + 1, len + 1);
}

int main () {

    freopen ("trie.in", "r", stdin);
    freopen ("trie.out", "w", stdout);

    int tip;
    R = new Trie ();

    scanf ("%d %s", &tip, cuv);
    while (!feof (stdin)) {

        cuv[ strlen (cuv) ] = '\n';
        if (tip == 0) adauga (R, cuv);
        if (tip == 1) sterge (R, cuv);
        if (tip == 2) printf ("%d\n", aparitii (R, cuv));
        if (tip == 3) printf ("%d\n", prefix (R, cuv, 0));

        memset (cuv, 0, sizeof (cuv));
        scanf ("%d %s", &tip, cuv);
    }

    return 0;
}