Cod sursa(job #1706363)

Utilizator cristina_borzaCristina Borza cristina_borza Data 22 mai 2016 13:03:30
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <cstring>

using namespace std;

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

char sir[200];
int type;

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

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

Trie *Root = new Trie;

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

    char qq = *s - 'a';
    if(node -> fiu[qq] == NULL) {
        node -> fiu[qq] = new Trie;
        node -> nrf++;
    }

    adauga(node -> fiu[qq] , s + 1);
}

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

    else {
        if(sterge(node -> fiu[qq] , s + 1)) {
            node -> fiu[qq] = 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;
    }

    char qq = *s - 'a';
    if(node -> fiu[qq] != NULL) {
        return nrap(node -> fiu[qq] , s + 1);
    }

    return 0;
}

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

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

    return lg;
}

int main() {
    while(f >> type) {
        memset(sir , 0 , sizeof(sir));
        f >> sir;

        if(type == 0) {
            adauga(Root , sir);
        }

        if(type == 1) {
            sterge(Root , sir);
        }

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

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