Cod sursa(job #3276480)

Utilizator Cristian_NegoitaCristian Negoita Cristian_Negoita Data 13 februarie 2025 19:09:41
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");

struct Trie
{
    int cnt, fii;
    Trie* fiu[26];
    Trie()
    {
        cnt = fii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};
Trie* T = new Trie;

void ins(Trie* node, string& s, int poz = 0)
{
    if(poz == s.size())
    {
        node->cnt++;
        return;
    }

    int id = s[poz] - 'a';
    if(node->fiu[id] == nullptr)
    {
        node->fiu[id] = new Trie;
        node->fii++;
    }
    ins(node->fiu[id], s, poz + 1);
}

bool del(Trie* node, string& s, int poz = 0)
{
    int id = s[poz] - 'a';
    if(poz == s.size())
        node->cnt--;
    else if(del(node->fiu[id], s, poz + 1))
    {
        node->fiu[id] = nullptr;
        node->fii--;
    }

    if(node->cnt == 0 && node->fii == 0 && node != T)
    {
        delete node;
        return true;
    }
    return false;
}

int query(Trie* node, string& s, int poz = 0)
{
    int id = s[poz] - 'a';
    if(poz == s.size())
        return node->cnt;
    if(node->fiu[id] != nullptr)
        return query(node->fiu[id], s, poz + 1);
    return 0;
}

int prefix(Trie* node, string& s, int poz = 0, int k = 0)
{
    int id = s[poz] - 'a';
    if(poz == s.size() || node->fiu[id] == nullptr)
        return k;
    return prefix(node->fiu[id], s, poz + 1, k + 1);
}

signed main()
{
    int cer;
    string s;
    while(fin >> cer >> s)
    {
        if(cer == 0)
            ins(T, s);
        else if(cer == 1)
            del(T, s);
        else if(cer == 2)
            fout << query(T, s) << "\n";
        else
            fout << prefix(T, s) << "\n";
    }

    return 0;
}