Cod sursa(job #635062)
#include <stdio.h>
const int dim = 26;
char S[dim];
struct nod {
nod *a[dim];
int fii, nr;
} *R;
void init (nod *&p)
{
p = new nod;
p->fii = p->nr = 0;
for (int i = 0; i < dim; i++)
p->a[i] = NULL;
}
void cit ()
{
fgets (S, dim, stdin);
for (int i = 2; S[i] != '\n'; i++)
S[i] -= 'a';
}
void ins (nod *p, char *s)
{
if (*s == '\n')
{
p->nr ++;
return;
}
if (p->a[*s] == NULL)
{
p->fii ++;
init (p->a[*s]);
}
ins (p->a[*s], s+1);
}
void del (nod *p, char *s)
{
if (*s == '\n')
{
p->nr --;
return;
}
del (p->a[*s], s+1);
if (p->a[*s]->nr == 0 && p->a[*s]->fii == 0)
{
delete p->a[*s];
p->a[*s] = NULL;
}
}
void afi (nod *p, char *s)
{
if (*s == '\n')
{
printf ("%d\n", p->nr);
return;
}
if (p->a[*s] == NULL)
{
printf ("0\n");
return;
}
afi (p->a[*s], s+1);
}
void pre (nod *p, char *s)
{
if (*s == '\n' || p->a[*s] == NULL)
{
printf ("%d\n", s-S-2);
return;
}
pre (p->a[*s], s+1);
}
int main ()
{
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
init (R);
cit ();
while ( !feof (stdin) )
{
switch (S[0])
{
case '0': ins (R, S+2); break;
case '1': del (R, S+2); break;
case '2': afi (R, S+2); break;
case '3': pre (R, S+2); break;
}
cit ();
}
return 0;
}