Cod sursa(job #3233308)

Utilizator MirceaDonciuLicentaLicenta Mircea Donciu MirceaDonciuLicenta Data 2 iunie 2024 22:53:04
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.37 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_map>
#include <string>

using namespace std;

struct TrieNode {
    unordered_map<char, TrieNode*> children;
    int count; // to store the number of times the word ends here

    TrieNode() : count(0) {}
};

class Trie {
public:
    Trie() {
        root = new TrieNode();
    }

    void addWord(const string& word) {
        TrieNode* node = root;
        for (char ch : word) {
            if (node->children.find(ch) == node->children.end()) {
                node->children[ch] = new TrieNode();
            }
            node = node->children[ch];
        }
        node->count++;
    }

    void removeWord(const string& word) {
        if (searchWord(word) > 0) {
            TrieNode* node = root;
            for (char ch : word) {
                if (node->children.find(ch) == node->children.end()) {
                    return;
                }
                node = node->children[ch];
            }
            node->count--;
        }
    }

    int searchWord(const string& word) {
        TrieNode* node = root;
        for (char ch : word) {
            if (node->children.find(ch) == node->children.end()) {
                return 0;
            }
            node = node->children[ch];
        }
        return node->count;
    }

    int longestPrefix(const string& word) {
        TrieNode* node = root;
        int length = 0;
        for (char ch : word) {
            if (node->children.find(ch) == node->children.end()) {
                break;
            }
            node = node->children[ch];
            length++;
        }
        return length;
    }

private:
    TrieNode* root;
};

int main() {
    ifstream infile("trie.in");
    ofstream outfile("trie.out");

    Trie trie;
    string line;
    while (getline(infile, line)) {
        char op;
        string word;
        istringstream iss(line);
        iss >> op >> word;

        if (op == '0') {
            trie.addWord(word);
        } else if (op == '1') {
            trie.removeWord(word);
        } else if (op == '2') {
            outfile << trie.searchWord(word) << endl;
        } else if (op == '3') {
            outfile << trie.longestPrefix(word) << endl;
        }
    }

    infile.close();
    outfile.close();

    return 0;
}