Pagini recente » Cod sursa (job #2556817) | Cod sursa (job #2159653) | Cod sursa (job #1665806) | Cod sursa (job #219362) | Cod sursa (job #1163049)
#include <iostream>
#include <fstream>
#include <cstring>
#define CH (*p - 'a')
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie {
int cnt, nrfii;
Trie *fiu[ 26 ];
Trie()
{
cnt = nrfii = 0;
memset( fiu, 0, sizeof( fiu ) );
}
};
Trie *T = new Trie;
void ins( Trie *nod, char *p )
{
if( *p == '\0' )
{
nod->cnt++;
return;
}
if(nod->fiu[ CH ] == 0)
{
nod->fiu[ CH ] = new Trie;
nod->nrfii++;
}
ins( nod->fiu[ CH ], p+1 );
}
int del( Trie *nod, char *p )
{
if( *p == '\0' )
nod->cnt--;
else if ( del( nod->fiu[ CH ], p + 1 ) )
{
nod->fiu[ CH ] = 0;
nod->nrfii--;
}
if( nod->cnt == 0 && nod->nrfii == 0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int cat( Trie *nod, char *p )
{
if( *p == '\0' )
return nod->cnt;
if( nod->fiu[ CH ] )
return cat( nod->fiu[ CH ], p+1 );
return 0;
}
int pre(Trie *nod, char *p, int k)
{
if( *p == '\n' || nod->fiu[ CH ] == 0 )
return k;
else
return pre( nod->fiu[ CH ], p + 1, k + 1 );
return 0;
}
int main()
{
char line[ 30 ];
f.getline(line, 30);
while( f.good( ) )
{
switch( line[0] )
{
case '0': ins(T, line + 2); break;
case '1': del(T, line + 2); break;
case '2': g << cat(T, line + 2) << "\n"; break;
case '3': g << pre(T, line + 2, 0) << "\n"; break;
}
f.getline(line, 30);
}
return 0;
}