Cod sursa(job #3348898)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 24 martie 2026 16:34:44
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>

using namespace std;

const int nmax = 1e5 + 5;

ifstream f("trie.in");
ofstream g("trie.out");

struct trie {
    int cnt, son;
    trie* v[30];

    trie() {
        cnt = son = 0;
        for (int i = 0; i <= 26; i++) v[i] = nullptr;
    }
};

trie* root;

void add(string s, int ind, trie* node)
{
    if (ind >= s.size()) {
        node->cnt++;
        return;
    }

    int x = s[ind] - 'a';
    if (!node->v[x]) node->v[x] = new trie(), node->son++;
    add(s, ind + 1, node->v[x]);
}

bool del(string s, int ind, trie* node)
{
    if (ind >= s.size())
    {
        node->cnt--;
        if (!node->cnt && !node->son && node != root) {
            delete node;
            return true;
        }
        return false;
    }

    int x = s[ind] - 'a';
    if (!node->v[x]) return false;

    if(del(s, ind + 1, node->v[x]))
        node->son--, node->v[x] = nullptr;
    
    if (!node->cnt && !node->son && node != root) {
        delete node;
        return true;
    }

    return false;
}

int number(string s, int ind, trie* node)
{
    if (ind >= s.size()) return node->cnt;

    int x = s[ind] - 'a';
    if (!node->v[x]) return 0;
    return number(s, ind + 1, node->v[x]);
}

int pref(string s, int ind, trie* node)
{
    if (ind >= s.size()) return s.size();

    int x = s[ind] - 'a';
    if (!node->v[x]) return ind;
    return pref(s, ind + 1, node->v[x]);
}

int main()
{
    int tip; string s; root = new trie();
    while (f >> tip >> s)
        if (tip == 0) add(s, 0, root);
        else if (tip == 1) del(s, 0, root);
        else if (tip == 2) g << number(s, 0, root) << '\n';
        else g << pref(s, 0, root) << '\n';

    return 0;
}