Cod sursa(job #2656455)

Utilizator witekIani Ispas witek Data 7 octombrie 2020 19:23:31
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>
#include <cstring>
using namespace std;

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

const int SIGMA = 26;

struct TrieNode {
    TrieNode* next[SIGMA] = {};
    int wordsEndHere = 0;
    int wordsContained = 0;
};

TrieNode *root;

char word[SIGMA + 1];

void addWord(TrieNode *node, char *word) {
    node->wordsContained ++;
    if(*word == '\0') {
        node->wordsEndHere ++;
        return;
    }
    int nextIndex = *word - 'a';
    if(node->next[nextIndex] == nullptr) {
        node->next[nextIndex] = new TrieNode;
    }
    addWord(node->next[nextIndex], word + 1);
}

void deleteWord(TrieNode *node, char *word) {
    node->wordsContained --;
    if(*word == '\0') {
        node->wordsEndHere --;
        return;
    }
    int nextIndex = *word - 'a';
    deleteWord(node->next[nextIndex], word + 1);
    if(node->next[nextIndex]->wordsContained == 0) {
        free(node->next[nextIndex]);
        node->next[nextIndex] = nullptr;
    }
}

int appeared_trie(TrieNode *node, char *word) {
    if(*word == '\0') {
        return node->wordsEndHere;
    }
    int nextIndex = *word - 'a';
    if(node->next[nextIndex] == nullptr)
        return 0;
    return appeared_trie(node->next[nextIndex], word + 1);
}

int longest_common_prefix(TrieNode *node, char *word) {
    if(*word == '\0')
        return 0;
    int nextIndex = *word - 'a';
    if(node->next[nextIndex] == nullptr)
        return 0;
    return 1 + longest_common_prefix(node->next[nextIndex], word + 1);
}


int main() {
    int op;
    char s[100] = {};
    root = new TrieNode;
    while(f.getline(s, SIGMA)) {
        switch(s[0]) {
            case '0' : addWord(root, s + 2); break;
            case '1' : deleteWord(root, s + 2); break;
            case '2' : g << appeared_trie(root, s + 2) << '\n'; break;
            case '3' : g << longest_common_prefix(root, s + 2) << '\n'; break;
        }
    }
}