Pagini recente » Cod sursa (job #1862961) | Cod sursa (job #2723885) | Cod sursa (job #2238722) | Cod sursa (job #2680703) | Cod sursa (job #1022287)
#include <cstdio>
#include <cstring>
using namespace std;
struct trie{
int nr, desc;
trie *urm[26];
trie(){
nr = desc = 0;
memset(urm, NULL, sizeof(urm));
}
};
trie *p = new trie;
void add(trie *aux, char *s )
{
if( *s == '\0'){
++aux->nr;
return;
}
if( aux->urm[*s-97] == NULL){
aux->urm[*s-97] = new trie;
++aux->desc;
}
add(aux->urm[*s-97],s+1);
}
int del(trie *aux, char *s)
{
if( *s == '\0') --aux->nr;
else if(del(aux->urm[*s-97], s+1)){
aux->urm[*s-97] = NULL;
--aux->desc;
}
if(aux->nr == 0 && aux->desc == 0 && aux != p)
{
delete aux;
return 1;
}
return 0;
}
int count( trie *aux, char *s )
{
if( *s == '\0' ) return aux->nr;
if( aux->urm[*s-97] != NULL)
return count( aux->urm[*s-97], s+1);
return 0;
}
int lgprefmax( trie *aux, char *s, int k )
{
if( *s == '\0' || aux->urm[*s-97] == NULL ) return k;
return lgprefmax(aux->urm[*s-97], s+1, k+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int op;
char sir[25];
scanf("%d",&op);
gets(sir);
while( !feof(stdin) )
{
switch(op)
{
case 0: add(p, sir+1); break;
case 1: del(p, sir+1); break;
case 2: printf("%d\n",count(p, sir+1)); break;
case 3: printf("%d\n",lgprefmax(p, sir+1
, 0)); break;
}
scanf("%d",&op);
gets(sir);
}
fclose(stdin);
fclose(stdout);
return 0;
}