Cod sursa(job #3175398)

Utilizator Traian_7109Traian Mihai Danciu Traian_7109 Data 25 noiembrie 2023 19:02:04
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h>

using namespace std;

namespace Trie {
    struct Node {
        Node *next[26];
        int cnt, aux;
        
        Node() {
            this->cnt = this->aux = 0;
            for (int i = 0; i < 26; i++) {
                this->next[i] = nullptr;
            }
        }
    };
    
    Node *root;
    
    void add(Node *node, string word, int pos) {
        node->aux++;
        if (pos == word.size()) {
            node->cnt++;
            return;
        }
        if (node->next[word[pos] - 'a'] == nullptr) {
            node->next[word[pos] - 'a'] = new Node;
        }
        add(node->next[word[pos] - 'a'], word, pos + 1);
    } 
    
    void rem(Node *node, string word, int pos) {
        node->aux--;
        if (pos == word.size()) {
            node->cnt--;
            return;
        }
        rem(node->next[word[pos] - 'a'], word, pos + 1);
    }
    
    int freq(Node *node, string word, int pos) {
        if (pos == word.size()) {
            return node->cnt;
        }
        if (node->next[word[pos] - 'a'] == nullptr) {
            return 0;
        }
        return freq(node->next[word[pos] - 'a'], word, pos + 1);
    }
    
    int pref(Node *node, string word, int pos) {
        if (pos == word.size()) {
            return pos;
        }
        if (node->next[word[pos] - 'a'] == nullptr || node->next[word[pos] - 'a']->aux == 0) {
            return pos;
        }
        return pref(node->next[word[pos] - 'a'], word, pos + 1);
    }
}

signed main() {
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    Trie::root = new Trie::Node;
    int task;
    string word;
    while (fin >> task >> word) {
        if (task == 0) {
            Trie::add(Trie::root, word, 0);
        } else if (task == 1) {
            Trie::rem(Trie::root, word, 0);
        } else if (task == 2) {
            fout << Trie::freq(Trie::root, word, 0) << '\n';
        } else {
            fout << Trie::pref(Trie::root, word, 0) << '\n';
        }
    }
    return 0;
}