Cod sursa(job #3183653)

Utilizator Antonio09Nastase Antonio Antonio09 Data 12 decembrie 2023 17:30:25
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");

struct Node{
    Node* letters[26];
    int counter;
    int num_letters[26];

    Node(){
        this->counter = 0;
        for(int i = 0; i < 25; i++){
            this->letters[i] = NULL;
            this->num_letters[i] = 0;
        }
    }
};

Node* trie = new Node();

void Trie_Insert(string word){
    Node* p = trie;
    for(unsigned i = 0; i < word.length(); i++){
        int index = word[i] - 'a';
        if(!p->letters[index]){
            p->letters[index] = new Node();
        }
        p->num_letters[index]++;
        p = p->letters[index];
    }
    p->counter++;
}

void Trie_Delete(string word){
    Node* p = trie;
    for(unsigned i = 0; i < word.length(); i++){
        int index = word[i] - 'a';
        p->num_letters[index]--;
        if(p->num_letters[index] == 0){
            delete  p->letters[index];
            p->letters[index] = NULL;
            return;
        }
        p = p->letters[index];
    }
    p->counter--;
}

void Trie_Count(string word){
    Node* p = trie;
    for(unsigned i = 0; i < word.length(); i++){
        int index = word[i] - 'a';
        p = p->letters[index];
    }
    out << p->counter << '\n';
}

void Trie_Prefix(string word){
    int len = 0;
    Node* p = trie;
    for(unsigned i = 0; i < word.length(); i++){
        int index = word[i] - 'a';
        if(!p->letters[index]){
            out << len << '\n';
            return;
        }
        p = p->letters[index];
        ++len;
    }
}

int main()
{
    int op;
    string word;
    while(in >> op >> word){
        switch(op){
            case 0:
                Trie_Insert(word);
                break;
            case 1:
                Trie_Delete(word);
                break;
            case 2:
                Trie_Count(word);
                break;
            case 3:
                Trie_Prefix(word);
                break;
        }
    }

    return 0;
}