Cod sursa(job #1117926)

Utilizator manutrutaEmanuel Truta manutruta Data 23 februarie 2014 21:07:46
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;

#define ALF 26

struct trie {
    int key, nrChild;
    trie* next[ALF];

    trie() {
        nrChild = key = 0;
        memset(next, 0, sizeof(next));
    }
};

FILE* f = fopen("trie.in", "r");
FILE* g = fopen("trie.out", "w");

trie root;
char buf[25];

void add(trie* node, char* c)
{
    while (*c != '\n') {
        if (node->next[*c - 'a'] == 0) {
            node->next[*c - 'a'] = new trie;
            node->nrChild++;
        }
        node = node->next[*c - 'a'];
        c++;
    }
    node->key++;
}

bool del(trie* node, char* c)
{
    if (*c == '\n') {
        node->key--;
    } else if (del(node->next[*c - 'a'], c + 1) == true) {
        node->next[*c - 'a'] = 0;
        node->nrChild--;
    }

    if (node->key == 0 && node->nrChild == 0 && node != &root) {
        delete node;
        return true;
    }
    return false;
}

int numAparitions(trie* node, char* c)
{
    while (*c != '\n') {
        if (node->next[*c - 'a'] == 0) {
            return 0;
        }
        node = node->next[*c - 'a'];
        c++;
    }
    return node->key;
}

int maxPrefix(trie* node, char* c)
{
    int nr = 0;
    while (*c != '\n' && node->next[*c - 'a'] != 0) {
        node = node->next[*c - 'a'];
        c++, nr++;
    }
    return nr;
}

int main()
{
    while (fgets(buf, sizeof(buf), f)) {
        switch (buf[0]) {
            case '0': add(&root, buf + 2); break;
            case '1': del(&root, buf + 2); break;
            case '2': fprintf(g, "%d\n", numAparitions(&root, buf + 2)); break;
            case '3': fprintf(g, "%d\n", maxPrefix(&root, buf + 2)); break;
        }
    }

    fclose(f);
    fclose(g);
    return 0;
}