Pagini recente » Cod sursa (job #635244) | Cod sursa (job #2505795) | Cod sursa (job #1846626) | Cod sursa (job #1013978) | Cod sursa (job #1239276)
#include <fstream>
#include <cstring>
const char IN [ ] = "trie.in" ;
const char OUT [ ] = "trie.out" ;
const int ALPHA = 26 ;
using namespace std;
ofstream fout ( OUT ) ;
char sir [ ALPHA + 14 ] ;
struct TRIE {
int cnt ;
int fii ;
TRIE *beta [ ALPHA ] ;
TRIE ( )
{
cnt = 0 ;
fii = 0 ;
memset ( beta , 0 , sizeof ( beta ) ) ;
}
};
TRIE *T = new TRIE ;
void bag ( TRIE *nod , char *s )
{
if ( *s == '\n' )
{
nod -> cnt ++ ;
return ;
}
if ( nod -> beta [ *s - 'a' ] == 0 )
{
nod -> beta [ *s - 'a' ] = new TRIE ;
nod -> fii ++ ;
}
bag ( nod -> beta [ *s - 'a' ] , s + 1 ) ;
}
int scot ( TRIE *nod , char *s )
{
if ( *s == '\n' )
{
nod -> cnt -- ;
}
else if ( scot ( nod -> beta [ *s - 'a' ] , s + 1 ) )
{
nod -> beta [ *s - 'a' ] = 0 ;
nod -> fii -- ;
}
if ( nod -> cnt == 0 and nod -> fii == 0 and nod != T )
{
delete nod ;
return 1 ;
}
return 0 ;
}
int query ( TRIE *nod , char *s )
{
if ( *s == '\n' )
{
return nod -> cnt ;
}
if ( nod -> beta [ *s - 'a' ] )
return query ( nod -> beta [ *s - 'a' ] , s + 1 ) ;
return 0 ;
}
int pre ( TRIE *nod , char *s , int k )
{
if ( *s == '\n' or nod -> beta [ *s - 'a' ] == 0 )
return k ;
return pre ( nod -> beta [ *s - 'a' ] , s + 1 , k + 1 ) ;
}
int main( )
{
freopen ( IN , "r" , stdin ) ;
fgets ( sir , ALPHA + 14 , stdin ) ;
while ( ! feof ( stdin ) ){
switch ( sir [ 0 ] ){
case '0' : bag ( T , sir + 2 ) ; break ;
case '1' : scot ( T , sir + 2 ) ; break ;
case '2' : fout << query ( T , sir + 2 ) << '\n' ; break ;
case '3' : fout << pre ( T , sir + 2 , 0 ) << '\n' ; break ;
}
fgets ( sir , ALPHA + 14 , stdin ) ;
}
return 0;
}