Cod sursa(job #3337817)

Utilizator Victor5539Tanase Victor Victor5539 Data 30 ianuarie 2026 10:26:48
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
#include <bits/stdc++.h>

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

int type;
string s;


struct node
{
    int kids,value;
    node *l[26]{};

    node(): kids(0),value(0) {}
}*root;


bool delete_condition(node *nod)
{
    return nod!=root && nod->value==0 && nod->kids==0;
}

void add(node *root, int depth)
{
    if (depth==s.size())
        root->value++;
    else
    {
        int letter=s[depth]-'a';


        if (root->l[letter]==NULL)
        {
            root->l[letter]=new node();
            root->kids++;
        }

        add(root->l[letter],depth+1);
    }
}

int nr_strings(node *root, int depth)
{
    if (depth==s.size())
        return root->value;
    else
    {
        int letter=s[depth]-'a';

        if (root->l[letter]==NULL)
            return 0;
        else
            return nr_strings(root->l[letter],depth+1);
    }
}

int longest_prefix(node *root, int depth)
{
    if (depth==s.size())
        return depth;
    else
    {
        int letter=s[depth]-'a';

        if (root->l[letter]==NULL)
            return depth;
        else
            return longest_prefix(root->l[letter],depth+1);
    }
}

bool del(node *root, int depth)
{
    if (depth==s.size())
    {
        root->value--;

        bool ans=delete_condition(root);

        if (ans)
            delete root;

        return ans;
    }
    else
    {
        bool ans=0;

        int letter=s[depth]-'a';
        bool deleted=del(root->l[letter],depth+1);

        if (deleted)
        {
            root->l[letter]=NULL;
            root->kids--;

            if (delete_condition(root))
            {
                ans=1;
                delete root;
            }
        }

        return ans;
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr); fout.tie(nullptr);

    root=new node();

    while (fin>>type>>s)
    {
            if (type==0)
                add(root,0);

            if (type==1)
                del(root,0);

            if (type==2)
                fout<<nr_strings(root,0)<<'\n';

            if (type==3)
                fout<<longest_prefix(root,0)<<'\n';

    }
    return 0;
}