Cod sursa(job #2553585)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 22 februarie 2020 10:06:30
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <fstream>
#include <vector>
#include <string.h>
using namespace std;

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

struct node
{
    int info;
    node *copii[28];
    int lung;

    node()
    {
        info = 0;
        memset(copii, 0, sizeof(copii));
    }
} *r;

void adauga(node *&n, char *c)
{
    if(c[0] == '\0')
    {
        n->info++;
        return;
    }
    if(n->copii[c[0] - 'a'] == nullptr)
    {
        n->copii[c[0] - 'a'] = new node();
        n->lung++;
    }
    adauga(n->copii[c[0] - 'a'], c+1);
}

int delCuv(node *&n, char *c)
{
    if(c[0] == '\0')
    {
        n->info--;
        if(n->info == 0 && n->lung == 0)
        {
            delete n;
            return 1;
        }
        return 0;
    }
    if(delCuv(n->copii[c[0] - 'a'], c+1) == 1)
    {
        n->copii[c[0] - 'a'] = 0;
        n->lung--;
        if(n->lung == 0 && n->info == 0 && n != r)
        {
            delete n;
            return 1;
        }
    }
    return 0;
}

int apar(node *&n, char *c)
{
    if(c[0] == '\0')
    {
        return n->info;
    }
    if(n->copii[c[0] - 'a'] == nullptr)
    {
        return 0;
    }
    return apar(n->copii[c[0] - 'a'], c+1);
}

int prefix(node *&n, char *c, int niv)
{
    if(c[0] == '\0')
    {
        return niv;
    }
    if(n->copii[c[0] - 'a'] == nullptr)
    {
        return niv;
    }
    return prefix(n->copii[c[0] - 'a'], c+1, niv+1);
}

void solve()
{
    r = new node();
    int command;
    char word[23];
    while(!f.eof())
    {
        f>>command>>word;
        if(f.eof())
            return;
        if(command == 0)
            adauga(r, word);
        else if(command == 1)
            delCuv(r, word);
        else if(command == 2)
            g<<apar(r, word)<<"\n";
        else
            g<<prefix(r, word, 0)<<"\n";

    }
}

int main()
{
    solve();
    return 0;
}