Cod sursa(job #3295606)

Utilizator mateilucaLuca Matei Gabriel mateiluca Data 7 mai 2025 09:43:43
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie{
    int cnt, nr_fii;
    Trie *fiu[26];
    Trie()
    {
        cnt = nr_fii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};
Trie *T = new Trie;
void Insert(Trie *nod, char *s)
{
    if(*s == '\0')
    {
        nod->cnt++;
        return ;
    }
    if(nod->fiu[*s - 'a'] == 0)
    {
        Trie *nod2 = new Trie;
        nod->fiu[*s - 'a'] = nod2;
        nod->nr_fii++;
    }
    Insert(nod->fiu[*s - 'a'], s + 1);
}
int Delete(Trie *nod, char *s)
{
    if(*s == '\0')
        nod->cnt--;
    else if(Delete(nod->fiu[*s - 'a'], s + 1))
    {
        nod->nr_fii--;
        nod->fiu[*s - 'a'] = 0;
    }
    if(nod->cnt == 0 && nod->nr_fii == 0 && nod != T)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int Query(Trie *nod, char *s)
{
    if(*s == '\0')
        return nod->cnt;
    if(nod->fiu[*s - 'a'] == 0)
        return 0;
    return Query(nod->fiu[*s - 'a'], s + 1);
}
int Prefix(Trie *nod, char *s, int sol)
{
    if(*s == '\0')
        return sol;
    if(nod->fiu[*s - 'a'] == 0)
        return sol;
    return Prefix(nod->fiu[*s - 'a'], s + 1, sol + 1);
}

int main()
{
    int op;
    char ch[25];
    while(fin >> op >> ch)
    {
        switch(op)
        {
            case 0: Insert(T, ch);break;
            case 1: Delete(T, ch);break;
            case 2: fout << Query(T, ch) << "\n";break;
            case 3: fout << Prefix(T, ch, 0) << "\n";break;
        }
    }
    fout.close();
    return 0;
}