Pagini recente » Cod sursa (job #3174625) | Cod sursa (job #484721) | Cod sursa (job #2533348) | Cod sursa (job #554422) | Cod sursa (job #519861)
Cod sursa(job #519861)
#include <cstdio>
#include <string.h>
using namespace std;
#define TRIE_D 26
#define LINE_D 32
#define IMP "trie.in"
#define OUTP "trie.out"
struct Trie
{
int contor, nr_fii;
Trie *fiu [ TRIE_D ];
Trie()
{
contor = nr_fii = 0;
memset( fiu, 0, sizeof( fiu ) );
}
};
Trie *T = new Trie;
inline int caracter ( char * );
void insert_0( Trie * , char * );
int delete_1( Trie * , char * );
int queue_2( Trie * , char * );
int prefix_3( Trie * , char * , int );
int main()
{
char line[ LINE_D ];
freopen( IMP , "r" , stdin );
freopen( OUTP , "w" , stdout );
fgets( line, LINE_D , stdin );
while( !feof( stdin ) )
{
switch( line[0] )
{
case '0': {
insert_0( T, line+2 );
break;
}
case '1': {
delete_1( T, line+2 );
break;
}
case '2': {
printf( "%d\n", queue_2( T, line+2 ) );
break;
}
case '3': {
printf( "%d\n", prefix_3( T, line+2, 0 ) );
break;
}
}
fgets( line, LINE_D , stdin );
}
return 0;
}
inline int caracter ( char *s )
{
return (*s - 'a');
}
void insert_0( Trie *nod, char *s )
{
if( *s == '\n' )
{
nod->contor ++;
return;
}
if( nod->fiu[ caracter(s) ] == 0 )
{
nod->fiu[ caracter(s) ] = new Trie;
nod->nr_fii ++;
}
insert_0( nod->fiu[ caracter(s) ], s+1 );
}
int delete_1( Trie *nod, char *s )
{
if( *s == '\n' )
nod->contor --;
else
if( delete_1( nod->fiu[ caracter(s) ], s+1 ) )
{
nod->fiu[ caracter(s) ] = 0;
nod->nr_fii --;
}
if( nod->contor == 0 && nod->nr_fii == 0 && nod != T )
{
delete nod;
return 1;
}
return 0;
}
int queue_2( Trie *nod, char *s )
{
if( *s == '\n' )
return nod->contor;
if( nod->fiu[ caracter(s) ] )
return queue_2( nod->fiu[ caracter(s) ], s+1 );
return 0;
}
int prefix_3( Trie *nod, char *s, int k )
{
if( *s == '\n' || nod->fiu[ caracter(s) ] == 0 )
return k;
return prefix_3( nod->fiu[ caracter(s) ], s+1, k+1 );
}