Cod sursa(job #1044811)

Utilizator the_snyper06FMI - ALexandru Mihai the_snyper06 Data 30 noiembrie 2013 14:35:33
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include <fstream>
#include <iostream>
#include <cstring>
#include <unordered_map>

using namespace std;

struct TrieNode {
    int words, appearances;
    unordered_map <char, TrieNode *> letters;
};

TrieNode *trie;

ifstream fin("trie.in");
ofstream fout("trie.out");

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

    for (int i = 0; w[i]; i++) {
        char ch = w[i];
        if (temp_trie->letters.find(ch) != temp_trie->letters.end()) {
            temp_trie = temp_trie->letters[ch];
            temp_trie->appearances += 1;
        }
        else {
            temp_trie->letters[ch] = new TrieNode;
            temp_trie->letters[ch]->words = 0;
            temp_trie->letters[ch]->appearances = 1;
            temp_trie = temp_trie->letters[ch];
        }
    }
    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];
        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.find(ch) != temp_trie->letters.end() && temp_trie->letters[ch]->appearances > 0) {
            temp_trie = temp_trie->letters[ch];
        } else {
            fout << "0\n";
            return ;
        }
    }
    fout << temp_trie->words << "\n";
}

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.find(ch) == temp_trie->letters.end() || temp_trie->letters[ch]->appearances == 0) {
            fout << prefix_length << "\n";
            return ;
        } else {
            prefix_length += 1;
            temp_trie = temp_trie->letters[ch];
        }
    }
    fout << strlen(w) << "\n";
}

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

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

    while (fin >> command >> w) {
        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;
}