Cod sursa(job #3276920)

Utilizator Alex_DumitrascuAlex Dumitrascu Alex_Dumitrascu Data 15 februarie 2025 10:06:15
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct trie {
    int count = 0;
    int numar_fii = 0;
    trie* litere[26] = {nullptr};
};

void add_to_trie(trie* nod, const char* word) {
    if (word[0] == '\0') {
        nod->count++;
        return;
    }
    int letter_index = word[0] - 'a';
    if (nod->litere[letter_index] == nullptr) {
        nod->litere[letter_index] = new trie();
        nod->numar_fii++;
    }
    add_to_trie(nod->litere[letter_index], word + 1);
}

void remove_from_trie(trie* nod, const char* word) {
    if (word[0] == '\0') {
        nod->count--;
        return;
    }
    int letter_index = word[0] - 'a';
    if (nod->litere[letter_index] == nullptr) return;
    remove_from_trie(nod->litere[letter_index], word + 1);
    if (nod->litere[letter_index]->numar_fii == 0 && nod->litere[letter_index]->count == 0) {
        delete nod->litere[letter_index];
        nod->litere[letter_index] = nullptr;
        nod->numar_fii--;
    }
}

int how_many_in_trie(trie* nod, const char* word) {
    if (word[0] == '\0') {
        return nod->count;
    }
    int letter_index = word[0] - 'a';
    if (nod->litere[letter_index] == nullptr) return 0;
    return how_many_in_trie(nod->litere[letter_index], word + 1);
}

int longest_common_prefix(trie* nod, const char* word) {
    if (word[0] == '\0' || nod->litere[word[0] - 'a'] == nullptr) {
        return 0;
    }
    return 1 + longest_common_prefix(nod->litere[word[0] - 'a'], word + 1);
}

int main() {
    fin.tie(0); fin.sync_with_stdio(false);
    trie* root = new trie();
    int op;
    char cuvant[25];
    while (fin >> op >> cuvant) {
        if (op == 0) {
            add_to_trie(root, cuvant);
        } else if (op == 1) {
            remove_from_trie(root, cuvant);
        } else if (op == 2) {
            fout << how_many_in_trie(root, cuvant) << '\n';
        } else if (op == 3) {
            fout << longest_common_prefix(root, cuvant) << '\n';
        }
    }
    return 0;
}