Cod sursa(job #1475388)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 24 august 2015 01:14:02
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <cstring>
#define CH (*s - 'a')
using namespace std;

struct Trie
{
    int nrfii,nrcuv;
    Trie *fiu[26];
    Trie()
    {
        nrfii=0; nrcuv=0;
        memset( fiu, 0, sizeof( fiu ) );
    }
};

Trie *t=new Trie;

void ins(Trie *nod,char *s)
{
    if(*s=='\n') { nod->nrcuv++; return; }
    if(nod->fiu[CH]==0)
    {
        nod->fiu[CH]=new Trie;
        nod->nrfii++;
    }
    ins(nod->fiu[CH],s+1);
}

int del(Trie *nod,char *s)
{
    if(*s=='\n')
        nod->nrcuv--;
    else if(del(nod->fiu[CH],s+1))
            {
                nod->fiu[CH]=0;
                nod->nrfii--;
            }
   if( nod->nrcuv == 0 && nod->nrfii == 0 && nod != t ) {
        delete nod;
        return 1;
   }
    return 0;
}

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

int apar(Trie *nod,char *s)
{
    if(*s=='\n') return nod->nrcuv;

    if(nod->fiu[CH]) return apar(nod->fiu[CH],s+1);

    return 0;
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    char line[25];

    while( !feof( stdin ) ) {
        fgets( line, 32, stdin );
        switch( line[0] ) {
            case '0': ins( t, line+2 ); break;
            case '1': del( t, line+2 ); break;
            case '2': printf( "%d\n", apar( t, line+2 ) ); break;
            case '3': printf( "%d\n", pref( t, line+2, 0 ) ); break;
        }

       // fgets( line, 32, stdin );
    }
    fclose(stdin);
    fclose(stdin);
    return 0;
}