Cod sursa(job #2202486)

Utilizator rnqftwcalina florin daniel rnqftw Data 8 mai 2018 21:36:21
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>

using namespace std;

ifstream fin ("trie.in");
ofstream fout("trie.out");

int n,tip;

char sir[100];

struct noduri
{
    int ap, ok;
    noduri *v[26];
    noduri()
    {
        for(int i = 0; i < 26; ++ i)
            v[i] = NULL;
        ap = ok = 0;
    }
} *root;


void adauga(noduri *&nod, char *sir)
{
    if(*sir == 0)
    {
        ++ nod->ap;
        return;
    }
    if(nod->v[*sir - 'a'] == NULL)
    {
        nod->v[*sir - 'a'] = new noduri;
        ++ nod->ok;
    }
    adauga(nod->v[*sir - 'a'], sir + 1);
}

void sterge(noduri *&nod, char *sir)
{
    if(*sir == 0)
    {
        -- nod->ap;
        if(nod->ap == 0 && nod->ok == 0 && nod != root)
        {
            delete nod;
            nod = NULL;
        }
        return;
    }
    sterge(nod->v[*sir - 'a'], sir + 1);
    if(nod->v[*sir - 'a'] == NULL)
    {
        -- nod->ok;
        if(nod->ap == 0 && nod->ok == 0 && nod != root)
        {
            delete nod;
            nod = NULL;
        }
    }
}

int nr_cuvinte(noduri *nod, char *sir)
{
    if(*sir == 0)
    {
        return nod->ap;
    }
    if(nod->v[*sir - 'a'] == NULL)
        return 0;
    return nr_cuvinte(nod->v[*sir - 'a'], sir + 1);
}

int max_seq(noduri *nod, char *sir)
{
    if(*sir == 0)
        return 0;
    if(nod-> ok < 2)
        return 0;
    return 1 + max_seq(nod->v[*sir - 'a'], sir + 1);
}

int main()
{
    root = new noduri;
    while(fin>>tip)
    {
        fin>>sir;
        if(tip==0)
            adauga(root,sir);
        else if(tip==1)
            sterge(root,sir);
        else if(tip==2)
            fout<<nr_cuvinte(root,sir)<<"\n";
        else
            fout<<max_seq(root,sir)<<"\n";
    }
    return 0;
}