Pagini recente » Cod sursa (job #2517814) | Cod sursa (job #1171453) | Cod sursa (job #1046979) | Cod sursa (job #770876) | Cod sursa (job #593445)
Cod sursa(job #593445)
#include <cstdio>
const int S = 23;
char cuv[S];
struct trie
{
int nr;
trie *fiu[S];
};
trie *t;
inline int max(int a, int b)
{
return (a>b)?a:b;
}
inline int cod_litera (char l)
{
return l-'a';
}
bool gol(trie *t)
{
if (t->nr > 0)
return false;
for (int i = 0; i < S; ++i)
if (t->fiu[i] != NULL)
return false;
return true;
}
void creeaza(trie *&t)
{
t = new trie;
t->nr = 0;
for (int i = 0; i < S; ++i)
t->fiu[i] = NULL;
}
void adauga(trie *&t, char *cuv)
{
if (t == NULL)
creeaza(t);
if (*cuv == 0)
++t->nr;
else
adauga(t->fiu[cod_litera(*cuv)],cuv+1);
}
void sterge(trie *&t, char *cuv)
{
if (t == NULL)
return;
if (*cuv == 0)
--t->nr;
else
sterge(t->fiu[cod_litera(*cuv)],cuv+1);
if (gol(t))
{
delete t;
t = NULL;
}
}
int nr(trie *&t, char *cuv)
{
if (t == NULL)
return 0;
if (*cuv == 0)
return t->nr;
else
return nr(t->fiu[cod_litera(*cuv)],cuv+1);
}
int l_prefix_comun(trie *&t, char *cuv, int h)
{
if (t == NULL)
return h-1;
if (*cuv == 0)
return h;
if (t->nr > 0)
return max(h,l_prefix_comun(t->fiu[cod_litera(*cuv)],cuv+1,h+1));
else
return l_prefix_comun(t->fiu[cod_litera(*cuv)],cuv+1,h+1);
}
int main()
{
creeaza(t);
int nr_op;
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while ((scanf("%d",&nr_op)!=EOF)&&(scanf("%s",cuv)!=EOF))
{
if (nr_op == 0)
adauga(t,cuv);
if (nr_op == 1)
sterge(t,cuv);
if (nr_op == 2)
printf("%d\n",nr(t,cuv));
if (nr_op == 3)
printf("%d\n",l_prefix_comun(t,cuv,0));
}
return 0;
}