Cod sursa(job #1666198)

Utilizator bogdanpaunFMI Paun Bogdan Gabriel bogdanpaun Data 27 martie 2016 19:20:41
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 2.5 kb
#include <bits/stdc++.h>

using namespace std;

char buf[32];

struct nod{
    int opriri,fii;
    nod *fiu[26];
    nod() {
        opriri = 0;
        fii =0;
        memset(fiu,0,(sizeof(fiu) ));
    }
};

nod *d,*t = new nod,*nod_null = new nod;
char *c;
int ok,h;

void del(char *c,nod *d){
    if( *c == '\0' ){
        if( d->opriri >0 ){
            d->opriri--;
            ok = 1;
        }
        if(ok){
            d->fii--;
            //if( d->fii == 0 ) delete d;
        }
        return ;
    }
    if( d->fiu[*c-'a'] )
        del( c+1,d->fiu[*c-'a'] );


    if(ok){
        d->fii--;
        if( d->fii == 0 ){
            delete d->fiu[*c-'a'];
            d->fiu[*c-'a'] = 0;
        }

        //else d->fiu[*c-'a'] = 0;

    }
}

void aparitii(char *c,nod *d){
    if( *c == '\0' ){
        ok = d->opriri;
        return;
    }
    if( !(d->fiu[*c - 'a'])  )
        d->fiu[*c-'a'] = new nod;
    aparitii( c+1,d->fiu[*c-'a'] );
}

void prefix(char *c,nod *d){
    if( *c == '\0' ){
        return;
    }
    if( d->fii > 0 ) ok = h;
    //if( !(d->fiu[*c - 'a'])  )
      //  d->fiu[*c-'a'] = new nod;
    ++h;
    if( !(d->fiu[*c-'a']) ) return;
    prefix( c+1,d->fiu[*c-'a'] );
}



int main()
{
    //freopen("trie.in" , "r" , stdin);
    freopen("trie.out", "w" , stdout);
    ifstream f("trie.in",ios::in);

    while(true){
        f.getline(buf,32);
        if(buf[0] == '\0') break;
        switch( buf[0] ){
            case '0':{
                c = buf + 2;
                d = t;
                while(true){
                    if( *c == '\0' ){
                        d->opriri++;
                        d->fii++;
                        break;
                    }
                    if( !(d->fiu[*c - 'a'])  )
                            d->fiu[*c-'a'] = new nod;
                    d->fii++;
                    d = d->fiu[*c - 'a'];
                    ++c;
                }

                break;
            }
            case '1':{
                ok = 0;
                del(buf+2,t);

                break;
            }
            case '2':{
                ok = 0;
                aparitii( buf+2,t );
                printf("%d\n",ok);

                break;
            }
            case '3':{
                ok = 0;h = 0;
                prefix(buf+2,t);
                printf("%d\n",ok);

                break;
            }
        }

    }


    return 0;
}