Cod sursa(job #3321546)

Utilizator neymarrneymar neymarr Data 10 noiembrie 2025 00:42:26
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <iostream>
#include <fstream>
#include <cstring>
// #include <memory>

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

const int alphabet_size = 30;

class node{

public:
    node *next[alphabet_size];
    int ct,end;

    node() : ct(0), end(0)
    {
        for(int i = 0; i < alphabet_size; ++i)
            next[i] = NULL;
    }
};

void add(node *trie_node, std::string s, int pos)
{
    trie_node->ct++;

    if(s.size() == pos)
    {
        trie_node->end++;
        return;
    }    

    int letter = s[pos] - 'a';

    if(trie_node->next[letter] == NULL)
    {
        node *new_node = new node;
        trie_node->next[letter] = new_node;
    }

    add(trie_node->next[letter], s, pos + 1);
}

void del(node *trie_node, std::string s, int pos)
{
    trie_node->ct--;

    if(s.size() == pos)
    {
        trie_node->end--;
        return;
    }    

    int letter = s[pos] - 'a';

    del(trie_node->next[letter], s, pos + 1);

    if(trie_node->next[letter]->ct == 0)
    {
        delete trie_node->next[letter];
        trie_node->next[letter] = NULL;
    }
}


int count(node *trie_node, std::string s, int pos)
{
    if(trie_node == NULL)
        return 0;

    if(s.size() == pos)
        return trie_node->end;

    int letter = s[pos] - 'a';

    return count(trie_node->next[letter], s, pos + 1);
}


int pref(node *trie_node, std::string s, int pos)
{
    if(trie_node == NULL)
        return 0;
        
    if(s.size() == pos)
        return 0;

    int letter = s[pos] - 'a';

    return (trie_node->next[letter] != NULL) + pref(trie_node->next[letter], s, pos + 1);
}

int main()
{

 node *start_trie = new node;

    int op;
    std::string s;
    while(fin >> op >> s)
    {
        op++;
        if(op == 1)
            add(start_trie, s, 0);
        else if(op == 2)
            del(start_trie, s, 0);
        else if(op == 3)
            fout << count(start_trie, s, 0) << "\n";        
        else 
            fout << pref(start_trie, s, 0) << "\n";
    }

    fin.close();
    fout.close();

    return 0;


    return 0;
}