Pagini recente » Cod sursa (job #883052) | Cod sursa (job #1601995) | Cod sursa (job #621664) | Cod sursa (job #1023520) | Cod sursa (job #714835)
Cod sursa(job #714835)
#include <stdio.h>
const int dim = 26;
struct nod {
int c, f;
nod *a[dim];
};
void init (nod *p)
{
for (int i = 0; i < dim; i++)
p->a[i] = 0;
p->c = p->f = 0;
}
void punezero (char *p)
{
while (*p >= 'a' && *p <= 'z')
p++;
*p = 0;
}
void ins (nod *n, char *p)
{
if (*p == 0)
{
n->c++;
return;
}
char c = *p - 'a';
if (n->a[c] == 0)
{
n->a[c] = new nod;
n->f ++;
init (n->a[c]);
}
ins (n->a[c], p + 1);
}
void del (nod *n, char *p)
{
if (*p == 0)
{
if (n->c == 0)
printf ("DELETE ERROR\n");
else
n->c --;
return;
}
char c = *p - 'a';
if (n->a[c] != 0)
del (n->a[c], p + 1);
else
{
printf ("DELETE ERROR\n");
return;
}
if (n->a[c]->c == 0 && n->a[c]->f == 0)
{
delete n->a[c];
n->a[c] = 0;
n->f --;
}
}
void afi (nod *n, char *p)
{
if (*p == 0)
{
printf ("%d\n", n->c);
return;
}
char c = *p - 'a';
if (n->a[c] != 0)
afi (n->a[c], p + 1);
else
printf ("%d\n", 0);
}
void pre (nod *n, char *p, int k)
{
char c = *p - 'a';
if (*p == 0 || n->a[c] == 0)
{
printf ("%d\n", k);
return;
}
pre (n->a[c], p + 1, k + 1);
}
int main ()
{
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
int t;
char s[dim];
nod *R = new nod;
init (R);
while (scanf ("%d %s", &t, s) > 0)
{
punezero (s);
switch (t)
{
case 0:
ins (R, s);
break;
case 1:
del (R, s);
break;
case 2:
afi (R, s);
break;
case 3:
pre (R, s, 0);
break;
}
}
return 0;
}