Pagini recente » Cod sursa (job #2831825) | Cod sursa (job #1301278) | Cod sursa (job #1073790) | Cod sursa (job #2114853) | Cod sursa (job #1968849)
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie
{
int nf,fc;
Trie *fiu[26];
Trie()
{
nf=fc=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T=new Trie;
void ins(Trie *nod,char *s)
{
if(*s == '\n')
{
nod->fc++; return;
}
if(nod->fiu[(*s-'a')] ==0)
{
nod->fiu[(*s-'a')]=new Trie;
nod->nf++;
}
ins(nod->fiu[(*s-'a')],s+1);
}
int del(Trie *nod,char *s)
{
if(*s == '\n')
nod->fc--;
else if(del(nod->fiu[(*s-'a')],s+1 ))
{ nod->fiu[(*s-'a')]=0;
nod->nf--;
}
if(nod->fc==0 && nod->nf==0 && nod!=T)
{ delete nod;
return 1;
}
return 0;
}
int que( Trie *nod, char *s ) {
if( *s == '\n' )
return nod->fc;
if( nod->fiu[*s-'a'] )
return que( nod->fiu[ *s-'a' ], s+1 );
return 0;
}
int pre( Trie *nod, char *s, int k ) {
if( *s == '\n' || nod->fiu[ *s-'a' ] == 0 )
return k;
return pre( nod->fiu[ *s-'a' ], s+1, k+1 );
}
int main() {
char line[ 32 ];
freopen( "trie.in", "r", stdin );
freopen( "trie.out", "w", stdout );
fgets( line, 32, stdin );
while( !feof( stdin ) ) {
switch( line[0] ) {
case '0': ins( T, line+2 ); break;
case '1': del( T, line+2 ); break;
case '2': printf( "%d\n", que( T, line+2 ) ); break;
case '3': printf( "%d\n", pre( T, line+2, 0 ) ); break;
}
fgets( line, 32, stdin );
}
return 0;
}