Pagini recente » Cod sursa (job #1280667) | Cod sursa (job #1862767) | Cod sursa (job #2233049) | Cod sursa (job #221859) | Cod sursa (job #1117957)
#include <cstdio>
#include <cstring>
using namespace std;
#define TY (*s - 'a')
struct arb {
int so, tot;
arb *rt[ 26 ];
arb() {
so=tot = 0;
memset( rt, 0, sizeof( rt ) );
}
};
arb *T = new arb;
void ins( arb *nod, char *s ) {
if( *s == '\n' ) {
nod->so++; return;
}
if( nod->rt[TY] == 0 ) {
nod->rt[TY] = new arb;
nod->tot++;
}
ins( nod->rt[ TY ], s+1 );
}
int del( arb *nod, char *s ) {
if( *s == '\n' )
nod->so --;
else if( del( nod->rt[ TY ], s+1 ) ) {
nod->rt[ TY ] = 0;
nod->tot --;
}
if( nod->so == 0 && nod->tot == 0 && nod != T ) {
delete nod; return 1;
}
return 0;
}
int aparitii( arb *nod, char *s ) {
if( *s == '\n' )
return nod->so;
if( nod->rt[ TY ] )
return aparitii( nod->rt[TY], s+1 );
return 0;
}
int prefix( arb *nod, char *s, int k ) {
if( *s == '\n' || nod->rt[TY] == 0 )
return k;
return prefix(nod->rt[TY], s+1, k+1 );
}
int main() {
char linie[32];
freopen( "trie.in", "r", stdin );
freopen( "trie.out", "w", stdout );
fgets( linie, 32, stdin );
while( !feof( stdin ) ) {
switch( linie[0] ) {
case '0': ins(T,linie+2);break;
case '1': del(T,linie+2);break;
case '2': printf( "%d\n", aparitii( T, linie+2 ) ); break;
case '3': printf( "%d\n", prefix( T, linie+2, 0 ) ); break;
}
fgets( linie, 32, stdin );
}
return 0;
}