Pagini recente » Cod sursa (job #2129663) | Cod sursa (job #1544316) | Cod sursa (job #1724642) | Cod sursa (job #2853519) | Cod sursa (job #1403468)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct nod
{
nod * fii['z'-'a'+1];
int inf, nr_fii;
nod()
{
inf = nr_fii = 0;
memset(fii, 0, sizeof(fii));
}
} * radacina;
char a[100];
void adaugare(nod * n, char * a)
{
if (*a == 0)
n->inf++;
else
{
if (!n->fii[*a-'a'])
{
n->fii[*a-'a'] = new nod();
n->nr_fii++;
}
adaugare(n->fii[*a-'a'], a+1);
}
}
bool stergere(nod * n, char * a)
{
if (*a == 0)
n->inf--;
else
{
if (stergere(n->fii[*a-'a'], a+1))
{
n->fii[*a-'a'] = 0;
n->nr_fii--;
}
}
if (n->inf == 0 && n->nr_fii == 0 && n != radacina)
{
delete n;
return 1;
}
return 0;
}
int nr_aparitii(nod * n, char * a)
{
if (*a == 0)
return n->inf;
else if (n->fii[*a-'a'])
return nr_aparitii(n->fii[*a-'a'], a+1);
else
return 0;
}
int max_prefix(nod * n, char * a)
{
if (*a == 0)
return 0;
else if (n->fii[*a-'a'])
return 1 + max_prefix(n->fii[*a-'a'], a+1);
else
return 0;
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
radacina = new nod;
while (!feof(stdin))
{
gets(a);
scanf("\n");
switch (a[0])
{
case '0':
adaugare(radacina, a+2);
break;
case '1':
stergere(radacina, a+2);
break;
case '2':
printf("%d\n", nr_aparitii(radacina, a+2));
break;
case '3':
printf("%d\n", max_prefix(radacina, a+2));
break;
}
}
return 0;
}