Cod sursa(job #3183621)

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

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

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

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

Node* trie = new Node();

bool Has_All_Letters_Null(Node* p){
    for(int i = 0; i < 26; i++)
        if(p->letters[i])
            return 0;
    return 1;
}

Node* Trie_Find(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 = p->letters[index];
    }
    return p;
}

void Trie_Insert(string word){
    Node* p = Trie_Find(word);
    p->counter++;
}

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

void Trie_Count(string word){
    Node* p = Trie_Find(word);
    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;
}