Pagini recente » Cod sursa (job #1570951) | Cod sursa (job #1837342) | Cod sursa (job #1709077) | Cod sursa (job #426117) | Cod sursa (job #1237979)
#include <cstdio>
#include <cstring>
using namespace std;
#define ch *s - 'a'
struct trie{
int cnt , nrf ;
trie *fiu[26];
trie(){
cnt = nrf = 0;
memset( fiu, 0, sizeof( fiu ) );
}
};
trie *t = new trie;
void ins(trie *nod, char *s){
if( *s == '\n' ) { nod->cnt++; return; }
if( nod->fiu[ ch ] == NULL ){
nod->nrf++;
nod->fiu[ch] = new trie;
}
ins( nod->fiu[ ch ], s+1 );
}
int del(trie *nod, char *s){
if( *s == '\n' ) nod->cnt--;
else if( del( nod->fiu[ch],s+1 ) ){
nod->fiu[ch] = 0;
nod->nrf--;
}
if( nod->cnt == 0 && nod->nrf == 0 && nod != t){
delete nod; return 1;
}
return 0;
}
int que(trie *nod, char *s){
if( *s == '\n' ) return nod->cnt;
if( nod->fiu[ ch ] ){
return que( nod->fiu[ ch ], s+1 );
}
return 0;
}
int pre(trie *nod, char *s, int k){
if( *s == '\n' || nod->fiu[ch] == 0 )
return k;
return pre( nod->fiu[ch] , 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;
}