Cod sursa(job #3144224)

Utilizator AdiFBubuBubuianu Adrian AdiFBubu Data 6 august 2023 14:20:55
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

char line[26];

struct Trie
{
    int cnt, nrfii;
    Trie *fii[26];

    Trie()
    {
        cnt = nrfii = 0;
        memset(fii, 0, sizeof(fii));
    }
};

Trie *T = new Trie;

void ad(Trie *nod, char *s)
{
    if(s[0] == 0)
    {
        nod->cnt ++;
        return;
    }
    else if(nod->fii[ s[0] - 'a' ] == 0)
    {
        nod->nrfii ++;
        Trie *p = new Trie;
        nod->fii[ s[0] - 'a' ] = p;
    }
    ad(nod->fii[ s[0] - 'a' ], s + 1);
}

int del(Trie *nod, char *s)
{
    if(s[0] == 0)
        nod->cnt --;
    else if(del(nod->fii[ s[0] - 'a' ], s + 1) != 0)
    {
        nod->nrfii --;
        nod->fii[ s[0] - 'a' ] = 0;
    }
    if(nod->cnt == 0 && nod->nrfii == 0 && nod != T)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int ap(Trie *nod, char *s)
{
    if(s[0] == 0)
        return nod->cnt;
    if(nod->fii[ s[0] - 'a' ] == 0)
        return 0;
    return ap(nod->fii[ s[0] - 'a' ], s + 1);
}

int pref(Trie *nod, char *s, int k)
{
    if(s[0] == 0 || nod->fii[ s[0] - 'a' ] == 0)
        return k;
    return pref(nod->fii[ s[0] - 'a' ], s + 1, k + 1);
}

int main()
{
    while(f.getline(line, 26))
    {
        int op = line[0] - '0';
        if(op == 0)
            ad(T, line + 2);
        else if(op == 1)
            del(T, line + 2);
        else if(op == 2)
            g << ap(T, line + 2) << '\n';
        else g << pref(T, line + 2, 0) << '\n';
    }
    return 0;
}