Cod sursa(job #1138636)

Utilizator swim406Teudan Adina swim406 Data 10 martie 2014 13:01:22
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <stdio.h>
#include <cstring>

using namespace std;

struct Trie {
    int cnt, nrfii;
    Trie *fiu[26];

     Trie() {
        cnt = nrfii = 0;
        memset( fiu, 0, sizeof( fiu ) );
    }
};

Trie *T = new Trie;

void ins (Trie *nod, char *s) {
    if (*s == '\n') {
        nod->cnt++; //am adaugat un cuvant
        return;
    }

    if (nod->fiu[*s-'a'] == 0) { //daca nu exista litera
        nod->fiu[*s-'a'] = new Trie;
        nod->nrfii++;
    }

    ins (nod->fiu[*s-'a'], s+1); //litera urmatoare
}

int del (Trie *nod, char *s) {
    if (*s == '\n')
        nod->cnt--; //am eliminat un cuvant
    else if (del (nod->fiu[*s-'a'], s+1)) { //am sters litera urmatoare
        nod->fiu[*s-'a'] = 0;
        nod->nrfii--;
    }

    if (nod->cnt == 0 && nod->nrfii == 0 && nod != T)
        return 1;

    return 0;
}

int que (Trie *nod, char *s) {
    if (*s == '\n')
        return nod->cnt; //am gasit cuvantul
    if (nod->fiu[*s-'a'])
        return que (nod->fiu[*s-'a'], s+1); //litera urmatoare
}

int pre (Trie *nod, char *s, int k) {
    if (*s == '\n' || nod->fiu[*s-'a'] == 0)
        return k; //am gasit cel mai lung prefix
    return pre(nod->fiu[*s-'a'], s+1, k+1); //litera urmatoare, am marit lungimea prefixului
}

int main() {
    freopen ("trie.in", "r", stdin);
    freopen ("trie.out", "w", stdout);
    char line[25], c;
    int opt;
    fgets (line, 25, stdin);
    while (!feof (stdin)) {
        switch (line[0]) {
            case '0': ins (T, line + 2); break;
            case '1': del (T, line + 2); break;
            case '2': printf ("%d\n", que (T, line + 2)); break;
            case '3': printf ("%d\n", pre (T, line + 2, 0)); break;
        }
        fgets (line, 25, stdin);
    }
    return 0;
}