Pagini recente » Monitorul de evaluare | Istoria paginii utilizator/painkiller | Istoria paginii utilizator/ionicafulgerul | Cod sursa (job #1049984) | Cod sursa (job #2016803)
#include <fstream>
#define CH ( *s - 'a' )
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
char s[30];
int x;
struct Trie
{
int fii,crt;
Trie *v[26];
Trie()
{
fii = 0;
crt = 0;
for( int i = 0 ; i < 26 ; i++ )
v[ i ] = 0;
}
};
Trie *T = new Trie;
void ins( Trie *nod , char *s )
{
if( CH < 0 )
{
nod -> crt++;
return;
}
if( nod -> v[ CH ] == 0 )
{
nod -> v[ CH ] = new Trie;
nod -> fii++;
}
ins( nod -> v[ CH ] , s + 1 );
}
bool del( Trie *nod , char *s )
{
if( CH < 0 )
nod -> crt--;
else if( del( nod -> v[ CH ] , s + 1 ) )
{
nod -> v[ CH ] = 0;
nod -> fii--;
}
if( nod -> crt == 0 && nod -> fii == 0 && nod != T )
{
delete nod;
return 1;
}
return 0;
}
int app( Trie *nod , char *s )
{
if( CH < 0 )
return nod -> crt;
if( nod -> v[ CH ] )
return app( nod -> v[ CH ] , s + 1 );
return 0;
}
int pre( Trie *nod , char *s , int val )
{
if( CH < 0 || nod -> v[ CH ] == 0 )
return val;
return pre( nod -> v[ CH ] , s + 1 , val + 1 );
}
int main()
{
while( fin>>x )
{
fin>>s;
switch( x )
{
fin.get();
fin.get( s , 30 );
case( 0 ) :
ins( T , s );
break;
case( 1 ) :
del( T , s );
break;
case( 2 ) :
fout<<app( T , s )<<'\n';
break;
case( 3 ) :
fout<<pre( T , s , 0 )<<'\n';
break;
}
}
}