Cod sursa(job #2986476)

Utilizator StefannnnnStefan Stefannnnn Data 28 februarie 2023 17:44:10
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>
#include <set>
#include <map>
using namespace std;

ifstream cin("trie.in");
ofstream cout("trie.out");

multiset<string> words;

struct TrieNode {
    int counter;
    int is_in_words;
    map<char, TrieNode*> children;
    TrieNode() {
        counter = 0;
        is_in_words = 0;
        for(char c = 'a'; c <= 'z'; c ++) {
            children[c] = NULL;
        }
    }
};

void increase(TrieNode *root, string word) {
    TrieNode *node = root;
    for(char c : word) {
        if(node->children[c - 'a'] == NULL) {
            node->children[c - 'a'] = new TrieNode();
        }
        node = node->children[c - 'a'];
        node->is_in_words ++;
    }
    node->counter ++;
}

void decrease(TrieNode *root, string word) {
    TrieNode *node = root;
    for(char c : word) {
        if(node->children[c - 'a'] == NULL) {
            return;
        }
        node = node->children[c - 'a'];
        node->is_in_words --;
    }
    if(node->counter > 0)
        node->counter --;
}

int search(TrieNode *root, string word) {
    TrieNode *node = root;
    for(char c : word) {
        if(node->children[c - 'a'] == NULL) {
            return 0;
        }
        node = node->children[c - 'a'];
    }
    return node->counter;
}

int maxPrefixWord(TrieNode *root, string word) {
    TrieNode *node = root;
    int current_size = 0, maximum = 0;
    for(auto c : word) {
        if(node->children[c - 'a'] == NULL) {
            return maximum;
        }
        node = node->children[c - 'a'];
        current_size ++;
        if(node->is_in_words == true)
            maximum = current_size;
    }
    return maximum;
}

int main()
{
    TrieNode *root = new TrieNode();
    int query;
    while(cin >> query) {
        string word;
        cin >> word;
        if(query == 0) {
            increase(root, word);
            words.insert(word);
        } else if(query == 1) {
            decrease(root, word);
            words.erase(word);
        } else if(query == 2) {
            cout << search(root, word) << '\n';
        } else {
            cout << maxPrefixWord(root, word) << '\n';
        }
    }
    return 0;
}