Pagini recente » Cod sursa (job #128782) | Cod sursa (job #549379) | Cod sursa (job #2349950) | Cod sursa (job #2484907) | Cod sursa (job #2757230)
#include <stdio.h>
#include <stdlib.h>
#define NL 26
#define L 21
typedef struct nod nod;
struct nod
{
int nr_cuv, nr_pref;
nod* fii[NL];
};
nod* nod_nou()
{
nod* p = (nod*)malloc(sizeof(nod));
p->nr_cuv = 0;
p->nr_pref = 0;
int i;
for (i = 0; i < NL; i++)
{
p->fii[i] = NULL;
}
return p;
}
nod* adauga(nod* p, char* cuv)
{
if (p == NULL)
{
p = nod_nou(cuv[0]);
}
p->nr_pref++;
if (cuv[0] == '\0')//finalul cuvantului
{
p->nr_cuv++;
}
else
{
p->fii[cuv[0]- 'a'] = adauga(p->fii[cuv[0]- 'a'], cuv + 1);
}
return p;
}
nod* sterge(nod* p, char* s)
{
if (s[0] == '\0')
{
p->nr_cuv--;
}
else
{
p->fii[s[0] - 'a'] = sterge(p->fii[s[0] - 'a'], s + 1);
}
p->nr_pref--;
if (p->nr_pref == 0)
{
free(p);
p = NULL;
}
return p;
}
int nr_cuvinte(nod* p, char* cuv)
{
if (p == NULL)
{
return 0;
}
if (cuv[0] == '\0')
{
return p->nr_cuv;
}
return nr_cuvinte(p->fii[cuv[0]- 'a'], cuv + 1);
}
int lungime_pref(nod* p, char* cuv)
{
if (cuv[0] == '\0')///sirul s e vid
{
return 0;
}
if (p->fii[cuv[0]- 'a'] == NULL)
{
return 0;
}
return 1 + lungime_pref(p->fii[cuv[0]- 'a'], cuv + 1);
}
int main()
{
FILE *in, *out;
in = fopen("trie.in", "r");
out = fopen("trie.out", "w");
char s[L];
int tip;
nod *r = NULL;
while (fscanf(in, "%d %s", &tip, s) != EOF)
{
if (tip == 0)
{
r = adauga(r, s);
}
if (tip == 1)
{
r = sterge(r, s);
}
if (tip == 2)
{
fprintf(out, "%d\n", nr_cuvinte(r, s));
}
if (tip == 3)
{
fprintf(out, "%d\n", lungime_pref(r, s));
}
}
return 0;
}