Cod sursa(job #3340409)

Utilizator 0021592Grecu rares 0021592 Data 14 februarie 2026 10:43:19
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.26 kb
#include <fstream>
#include <string>
#include <vector>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
int cer, number_of_words;
string s;
struct nodes
{
    int frec[26] = {};
    int cnt = 0; //nu stiu ce face inca
    int nr = 0;
}k;
vector<nodes> v;
void add(int node, int i)
{
    nodes debug = v[node];
    if (i == s.size())
    {
        v[node].cnt++;
        v[node].nr++;
        return;
    }
    if (v[node].frec[s[i]-'a'] == 0)
    {
        v[node].frec[s[i]-'a'] = v.size();
        v.push_back(k);
        add(v.size()-1, i+1);
        v[node].nr++;
        return;
    }
    add(v[node].frec[s[i]-'a'], i+1);
    v[node].nr++;
}
void rem(int node, int i)
{
    nodes debug = v[node]; ///nu sterge tot
    if (i == s.size())
    {
        v[node].cnt--;
        v[node].nr--;
        return;
    }
    //out << s[i] << ' ' << v[node].frec[s[i]-'a'] << '\n';
    if (v[node].frec[s[i]-'a'] == 0)
        return; ///nu exista cuvantul
    rem(v[node].frec[s[i]-'a'], i+1);
    v[node].nr--;
    if (v[v[node].frec[s[i]-'a']].nr == 0) //nu mai are cuvinte, rupem muchia
    {
        int maybethis = v[node].frec[s[i]-'a'];
        v[node].frec[s[i]-'a'] = 0;
        //v.erase(v.begin() + v[node].frec[s[i]-'a']);
    }
}
int cauta(int node, int i)
{
    nodes debug = v[node];
    if (i == s.size())
        return v[node].cnt; ///aaaaaaa
    if (v[node].frec[s[i]-'a'] == 0)
        return 0; ///nu exista cuvantul
    return cauta(v[node].frec[s[i]-'a'], i+1);
}
int cauta_prefix_max(int node, int i)
{
    nodes debug = v[node];
    if (i == s.size())
        return i;
    if (v[node].frec[s[i]-'a'] == 0)//nu mai avem ce cauta
        return i;
    int val = cauta_prefix_max(v[node].frec[s[i]-'a'], i+1);
    return val;
}
int main()
{
    v.push_back(k);
    while(in >> cer)
    {
        in.get();
        getline(in, s);
        if (cer == 0)
        {
            number_of_words++;
            add(0, 0);
        }
        else if (cer == 1)
        {
            rem(0, 0);
            number_of_words--;
        }
        else if (cer == 2)
            out << cauta(0, 0) << '\n';
        else
            out << cauta_prefix_max(0, 0) << '\n';
    }
    return 0;
}