Cod sursa(job #1438589)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 20 mai 2015 13:00:44
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <iostream>
#include <cstdio>

#define CH (*cuv - 'a')

#define sigma 26

using namespace std;

struct Trie {
    int words;
    int prefixes;
    Trie *letter[sigma];

    Trie() {
        words = 0;
        prefixes = 0;

        for(int i = 0 ; i < sigma; ++i) {
            letter[i] = NULL;
        }
    }
} *root = new Trie();

void addWord(Trie *node, char* cuv) {
    if(*cuv == '\n') {
        node->words++;
        return;
    }

    node->prefixes++;
    if(node->letter[CH] == NULL) {
        node->letter[CH] = new Trie;
    }
    addWord(node->letter[CH], cuv + 1);
}

int countWord(Trie *node, char* cuv) {
    if(*cuv == '\n')
        return node->words;

    if(node->letter[CH] == NULL)
        return 0;

    return countWord(node->letter[CH], cuv+1);
}

int longestPrefix(Trie *node, char *cuv) {
    if(*cuv == '\n')
        return 0;

    if(node->letter[CH] == NULL || (node->letter[CH]->prefixes == 0 && node->letter[CH]->words == 0))
        return 0;

    return longestPrefix(node->letter[CH], cuv + 1) + 1;
}

void delWord(Trie *node, char* cuv) {
    if(*cuv == '\n') {
        node->words--;
        return;
    }

    // No need to check if cuv exists, guranteed by the problem statement
    //...

    node->prefixes--;
    delWord(node->letter[CH], cuv + 1);
}

char line[24];

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

    fgets(line, 24, stdin);

    while(!feof(stdin)) {
        char type = line[0];

        switch(type) {
            case '0':
                addWord(root, line + 2);
            break;
            case '1':
                delWord(root, line + 2);
            break;
            case '2':
                printf("%d\n", countWord(root, line+2));
            break;
            case '3':
                printf("%d\n", longestPrefix(root, line+2));
            break;

        }

        fgets(line, 24, stdin);
    }
    return 0;
}