Cod sursa(job #1044829)

Utilizator the_snyper06FMI - ALexandru Mihai the_snyper06 Data 30 noiembrie 2013 15:07:39
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <cstdio>
#include <cstring>

using namespace std;

struct TrieNode {
    int words, appearances;
    TrieNode *letters[27];
};

TrieNode *trie;

void trie_insert(char * w) {
    TrieNode * temp_trie = trie;

    for (int i = 0; w[i]; i++) {
        char ch = w[i];
        if (temp_trie->letters[ch - 'a'] != NULL) {
            temp_trie = temp_trie->letters[ch - 'a'];
            temp_trie->appearances += 1;
        }
        else {
            temp_trie->letters[ch - 'a'] = new TrieNode;
            temp_trie->letters[ch - 'a']->words = 0;
            temp_trie->letters[ch - 'a']->appearances = 1;
            temp_trie = temp_trie->letters[ch - 'a'];
        }
    }
    temp_trie->words += 1;
}

void trie_remove(char * w) {
    TrieNode * temp_trie = trie, *parent;
    for (int i = 0; w[i]; i++) {
        char ch = w[i];
        parent = temp_trie;
        temp_trie = temp_trie->letters[ch - 'a'];
        temp_trie->appearances -= 1;
    }

    temp_trie->words -= 1;
}

void trie_print(char * w) {
    TrieNode * temp_trie = trie;
    for (int i = 0; w[i]; i++) {
        char ch = w[i];
        if (temp_trie->letters[ch - 'a'] != NULL && temp_trie->letters[ch - 'a']->appearances > 0) {
            temp_trie = temp_trie->letters[ch - 'a'];
        } else {
            printf ("0\n");
            return ;
        }
    }
    printf ("%d\n", temp_trie->words);
}

void trie_prefix(char * w) {
    TrieNode * temp_trie = trie;
    int prefix_length = 0;

    for (int i = 0; w[i]; i++) {
        char ch = w[i];
        if (temp_trie->letters[ch - 'a'] == NULL || temp_trie->letters[ch - 'a']->appearances == 0) {
            printf ("%d\n", prefix_length);
            return ;
        } else {
            prefix_length += 1;
            temp_trie = temp_trie->letters[ch - 'a'];
        }
    }
    printf ("%d\n", strlen(w));
}

int main() {
    int command;
    char w[21];

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

    trie = new TrieNode;
    trie->words = 0;

    while (scanf ("%d %s", &command, w) != EOF) {
        if (command == 0) trie_insert(w);
        else if (command == 1) trie_remove(w);
        else if (command == 2) trie_print(w);
        else if (command == 3) trie_prefix(w);

    }

    return 0;
}