Pagini recente » Cod sursa (job #298300) | Cod sursa (job #2877948) | Cod sursa (job #1715554) | Cod sursa (job #2246189) | Cod sursa (job #251943)
Cod sursa(job #251943)
#include<fstream>
#include<cstring>
#define h ( *s -'a' )
using namespace std;
struct Trie
{
int nrfii, freq;
Trie *fiu[ 26 ];
Trie ()
{
nrfii=freq=0;
memset( fiu, 0, sizeof( fiu ) );
}
};
Trie* T=new Trie;
void insert ( Trie* t, char* s )
{
if ( *s )
{
if ( t->fiu [ h ] == 0 )
{
t -> fiu [ h ] = new Trie;
t->nrfii ++;
}
insert ( t->fiu [ h ], s+1 );
return;
}
t -> freq++;
}
int del ( Trie* t, char *s )
{
if( *s == 0 )
t -> freq --;
else
if ( del ( t -> fiu [ h ], s+1 ) )
{
t -> nrfii --;
t -> fiu [ h ] = 0;
}
if ( t->freq == 0 && t -> nrfii == 0 && t != T )
{
delete t;
return 1;
}
return 0;
}
int query_freq ( Trie* t, char* s )
{
if( *s == 0 )
return t -> freq;
if( t-> fiu [ h ] )
return query_freq ( t-> fiu [ h ], s+1 );
return 0;
}
int query_prefix ( Trie* t, char* s, int k )
{
if( t -> fiu [ h ] && s )
return query_prefix ( t -> fiu [ h ], s+1, k+1 );
return k;
}
int main ( )
{
char linie[32];
ifstream f( "trie.in" );
ofstream g( "trie.out" );
while ( f.getline ( linie, 30, '\n' ) )
{
switch ( linie [ 0 ] )
{
case '0': insert ( T, linie+2 ); break;
case '1': del ( T, linie+2 ); break;
case '2': g << query_freq ( T, linie+2 ) << '\n'; break;
case '3': g<< query_prefix ( T, linie+2, 0 )<< '\n'; break;
}
}
f.close ();
g.close ();
return 0;
}