Cod sursa(job #719068)

Utilizator Sm3USmeu Rares Sm3U Data 21 martie 2012 13:12:36
Problema Trie Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <cstdio>
#include <cstring>
#define max(a, b) ((a > b) ? a : b)

using namespace std;

class trie{
public:

    trie *a[26];
    int nr;
    int nrFii;

    trie(){
        nr = 0;
        nrFii = 0;
        memset (a, 0, sizeof(a));
    }
}*r;

int prefixMax;

void adauga (trie *&r, char *q){
    if (r == NULL){
        r = new trie;
    }
    if (q[0] == 0){
        r -> nr ++;
        return;
    }
    r -> nrFii ++;
    adauga (r -> a[q[0] - 'a'], q + 1);
}

int sterge (trie *&r, char *q)
{
    if (q[0] == 0){
        r -> nr --;
        if (r -> nrFii == 0 && r -> nr == 0){
            delete r;
            return 1;
        }
        return 0;
    }
    r -> nrFii --;
    if (sterge (r -> a[q[0] -'a'], q + 1)){
        r -> a[q[0] - 'a'] = 0;
    }
    if (r -> nrFii == 0 && r -> nr == 0){
        delete r;
        return 1;
    }
    return 0;
}

void aparitii (trie *&r, char *q)
{
    if (q[0] == 0 || r == NULL){
        if (r == NULL){
            printf ("0\n");
            return;
        }
        printf ("%d\n", r -> nr);
        return;
    }
    aparitii (r -> a[q[0] - 'a'], q + 1);
}

void prefix (trie *&r, char *q, int nivel){
    if (r == NULL){
        return;
    }
    if (q[0] == 0){
        if (r -> nr > 1 || r -> nrFii > 0){
            prefixMax = max (prefixMax, nivel);
        }
        return;
    }
    if (r -> nrFii > 0 || r -> nr > 0){
        prefixMax = max (prefixMax, nivel);
    }
    prefix (r -> a[q[0] - 'a'], q + 1, nivel + 1);
}

void citire()
{
    int caz;
    int z;
    while (scanf ("%d", &caz) == 1){
        char q[30];
        scanf ("%s", q);
        switch (caz){
        case 0:
            adauga (r, q);
            break;
        case 1:
            z = sterge (r, q);
            break;
        case 2:
            aparitii (r, q);
            break;
        case 3:
            prefixMax = 0;
            prefix (r, q, 0);
            printf ("%d\n", prefixMax);
            //printf ("caz3\n");
            break;
        }
    }
}

int main()
{
    freopen ("trie.in", "r", stdin);
    freopen ("trie.out", "w", stdout);
    citire();

    return 0;
}