Cod sursa(job #952022)

Utilizator Anca_PaneaPanea Anca Anca_Panea Data 22 mai 2013 15:44:57
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <cstdio>
#include <cstring>
 
#define CH (*s - 'a')
 
using namespace std;
 
struct Trie {
    int cnt, nrfii;
    Trie *fiu[ 26 ];
 
    Trie() {
        cnt = nrfii = 0;
        memset( fiu, 0, sizeof( fiu ) );
    }
};
 
Trie *T = new Trie;
 
void ins( Trie *nod, char *s ) {
    if( *s == '\n' ) {
        nod->cnt ++; 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->cnt --;
    else if( del( nod->fiu[ CH ], s+1 ) ) {
            nod->fiu[ CH ] = 0;
            nod->nrfii --;
        }
 
    if( nod->cnt == 0 && nod->nrfii == 0 && nod != T ) {
        delete nod; return 1;
    }
    return 0;
}
 
int que( Trie *nod, char *s ) {
    if( *s == '\n' )
        return nod->cnt;
 
    if( nod->fiu[ CH ] )
        return que( nod->fiu[ CH ], s+1 );
    return 0;
}
 
int pre( Trie *nod, char *s, int k ) {
    if( *s == '\n' || nod->fiu[ CH ] == 0 )
        return k;
    return pre( nod->fiu[ CH ], s+1, k+1 );
}

void ins1( Trie *nod, char *s ) 
{
	for(;*s!='\n';s++)
	{
		if(nod->fiu[CH]==0)
		{
		nod->fiu[CH]=new Trie;
		nod->nrfii++;
		}
		nod=nod->fiu[CH];
	}
	nod->cnt++;
}

int pre1( Trie *nod, char *s, int k ) {

	for(;*s!='\n';s++)
	{
		if(nod->fiu[CH]!=0)
			{
				nod=nod->fiu[CH];
				k++;
			}
		else break;
	}
return k;
}


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': ins1 ( T, line+2 ); break;
            case '1': del( T, line+2 ); break;
            case '2': printf( "%d\n", que( T, line+2 ) ); break;
            case '3': printf( "%d\n", pre1( T, line+2, 0 ) ); break;
        }
 
        fgets( line, 32, stdin );
    }
    return 0;
}