Cod sursa(job #2775433)

Utilizator CaptnBananaPetcu Tudor CaptnBanana Data 15 septembrie 2021 19:43:45
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 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 );

}



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", que( T, line+2 ) ); break;

			case '3': printf( "%d\n", pre( T, line+2, 0 ) ); break;

		}



		fgets( line, 32, stdin );

	}

	return 0;

}