Cod sursa(job #2655895)

Utilizator witekIani Ispas witek Data 5 octombrie 2020 22:04:38
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>

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;

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

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

int appeared_trie(TrieNode *node, string word) {
    if(word.size() == 0) {
        return node->wordsEndHere;
    }
    int nextIndex = word[0] - 'a';
    if(node->next[nextIndex] == nullptr)
        return 0;
    return appeared_trie(node->next[nextIndex], word.substr(1));
}

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


int main() {
    int op;
    string s;
    root = new TrieNode;
    while(f >> op >> s) {
        switch(op) {
            case 0 : addWord(root, s); break;
            case 1 : deleteWord(root, s); break;
            case 2 : g << appeared_trie(root, s) << '\n'; break;
            case 3 : g << longest_common_prefix(root, s) << '\n'; break;
        }
    }
}