Cod sursa(job #2674487)

Utilizator Iulia14iulia slanina Iulia14 Data 19 noiembrie 2020 12:23:37
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
struct nod
{
    int cnt, sons;
    nod *son[26];
    nod()
    {
        cnt = sons = 0;
        for (int i = 0; i < 26; i++)
            son[i] = 0;
    }
};
nod *trie = new nod;
void update(nod *trie, char *s, int val, int lit)
{
    int next;
    if (!lit)
    {
        trie->cnt += val;
        return;
    }
    if (trie->son[*s - 'a'] == 0)
    {
        trie->son[*s - 'a'] = new nod;
        trie->sons++;
    }
    update((trie->son[*s - 'a']), s + 1, val, lit - 1);
    if (val < 0)
    {
        nod *fiu = trie->son[*s - 'a'];
        if ((fiu->cnt) == 0 && fiu->sons==0)
        {
            delete(fiu);
            trie->sons--;
            trie->son[*s - 'a'] = 0;
        }
    }
}
int query(nod *trie, char *s, int lit)
{
    if (!lit)
        return trie->cnt;
    if (trie->son[*s - 'a'] == 0)
        return 0;
    return query(trie->son[*s - 'a'], s + 1,lit - 1);
}
int prefix(nod *trie, char *s, int lvl, int lit)
{
    if (!lit)
        return lvl;
    if (trie->son[*s - 'a'] == 0)
        return lvl;
    return prefix(trie->son[*s - 'a'], s + 1, lvl + 1, lit - 1);
}
char s[25];
int main()
{
    int op;
    trie->cnt = 1;
    while (cin >> op >> s)
    {
        int lit = strlen(s);
        if (op == 0)
            update(trie, s, 1, lit);
        else
        if (op == 1)
            update(trie, s, -1, lit);
        else
        if (op == 2)
            cout << query(trie, s, lit);
        else
        if (op == 3)
            cout << prefix(trie, s, 0, lit);
        if (op > 1)
        cout << '\n';
    }
    return 0;
}