Cod sursa(job #1371026)

Utilizator metrix007Lungu Ioan Adrian metrix007 Data 3 martie 2015 18:43:01
Problema Trie Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include<cstring>
#include<fstream>
#include<string>
using namespace std;
#define CH (*s - 'a')
char cuvant[100000];
int tip;
struct Trie {
    int cnt;
    int nrfii;
    Trie* fiu[26];
    Trie()
    {
        cnt=0;
        nrfii=0;
        memset (fiu,0,sizeof(fiu));
    }
};
Trie* T= new Trie;
void ins(Trie *T, char *s)
{
    if(*s=='\0') {T->cnt++; return;}

    if(T->fiu[*s-'a']==0)
    {
        T->fiu[*s-'a']=new Trie;
        T->nrfii++;

    }
        ins(T->fiu[*s-'a'],s+1);
}

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

int doi(Trie* T,char *s)
{
    if(*s=='\0') return T->cnt;
    if( T->fiu[*s-'a'] )
        return doi( T->fiu[*s-'a' ], s+1 );
    return 0;

}

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

      char line[ 32 ];

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

    fgets( line, 32, stdin );

    while( !feof( stdin ) ) {
        switch( line[0] ) {
            case '0': ins( T, line+2 ); break;
            case '1': del( T, line+2 ); break;
            case '2': printf( "%d\n", doi( T, line+2 ) ); break;
            case '3': printf( "%d\n", trei( T, line+2, 0 ) ); break;
        }

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