Cod sursa(job #2487162)

Utilizator verde.cristian2005Verde Flaviu-Cristian verde.cristian2005 Data 4 noiembrie 2019 09:32:57
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
struct Trie
{
    int cnt,nrfii;
    Trie *fiu[26];
    Trie()
    {
        nrfii = cnt = 0;
        memset ( fiu, 0, sizeof ( fiu ) );
    }
};
Trie *prim=new Trie;
void adaug ( Trie *nod, char *s )
{
    if(*s=='\n')
    {
        nod->cnt++;
        return;
    }
    else if(nod->fiu[*s-'a']==0)
    {
        nod->fiu[*s-'a']=new Trie;
        nod->nrfii++;
    }
    adaug(nod->fiu[*s-'a'],s+1);
}
bool scoate ( Trie *nod, char *s )
{
    if(*s=='\n')
        nod->cnt--;
    else if(scoate(nod->fiu[*s-'a'],s+1))
    {
        nod->nrfii--;
        nod->fiu[*s-'a']=0;
    }
    if(nod->nrfii==0&&nod->cnt==0&&nod!=prim)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int afiseaza ( Trie *nod, char *s )
{
    if(*s=='\n')
        return nod->cnt;
    else if(nod->fiu[*s-'a'])
        afiseaza(nod->fiu[*s-'a'],s+1);
    return 0;
}
int prefix ( Trie *nod, char *s, int max1 )
{
    if(*s=='\n'||nod->fiu[*s-'a']==0)
        return max1;
    return prefix(nod->fiu[*s-'a'],s+1, max1+1);
}
char s[30];
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    fgets(s,30,stdin);
    while(!feof(stdin))
    {
        if ( s[0] == '0' )
            adaug ( prim, s+2 );
        else if ( s[0] == '1' )
            scoate ( prim, s+2 );
        else if ( s[0] == '2' )
            cout<<afiseaza ( prim, s+2 )<<'\n';
        else
            cout<<prefix ( prim, s+2, 0)<<'\n';
        fgets(s,30,stdin);
    }
    return 0;
}