Pagini recente » Cod sursa (job #164891) | Istoria paginii runda/cnmnarad/clasament | Cod sursa (job #319814) | Cod sursa (job #1854258) | Cod sursa (job #1444628)
/**
* Worg
*/
#include <cstdio>
#include <cstring>
#define sigma 27
#define val (*s - 'a')
using namespace std;
FILE *fin=freopen("trie.in","r",stdin);
FILE *fout=freopen("trie.out","w",stdout);
struct trie
{
int nrfii, cnt;
trie *fiu[sigma];
trie()
{
memset(fiu, 0, sizeof(fiu));
nrfii = cnt = 0;
}
};
trie *T = new trie;
void ins(trie *nod, char *s)
{
if( *s == '\n' )
{
nod -> cnt ++; return;
}
if( nod -> fiu[ val ] == 0 )
{
nod -> fiu[ val ] = new trie;
nod -> nrfii ++;
}
ins( nod -> fiu[ val ], s + 1 );
}
int del(trie *nod, char *s)
{
if( *s == '\n' )
--nod -> cnt;
else if( del(nod -> fiu[ val ], s + 1) )
{
nod -> fiu[ val ] = 0;
--nod -> nrfii;
}
if( !nod -> nrfii && !nod -> cnt && nod != T )
{
delete nod; return 1;
}
return 0;
}
int query(trie *nod, char *s)
{
if( *s == '\n' )
return nod -> cnt;
if( nod -> fiu[val] )
return query( nod -> fiu[val], s + 1 );
return 0;
}
int prefix(trie *nod, char *s, int k)
{
if( *s == '\n' || nod -> fiu[ val ] == 0 )
return k;
return prefix( nod -> fiu[ val ], s + 1, k + 1 );
}
int main()
{
char S[32];
fgets(S, 32, stdin);
while( !feof(stdin) )
{
if( S[0] == '0' )
ins(T, S + 2);
else if( S[0] == '1' )
del(T, S + 2);
else if( S[0] == '2' )
printf("%d\n", query(T, S + 2) );
else
printf("%d\n", prefix(T, S + 2, 0) );
fgets(S, 32, stdin);
}
}