Pagini recente » Cod sursa (job #874053) | Cod sursa (job #2853937) | Cod sursa (job #1011525) | Cod sursa (job #838241) | Cod sursa (job #1428081)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct trie
{
int nr_fii, cnt;
struct trie* fii[26];
};
typedef struct trie trie;
trie * radacina;
trie * make_trie()
{
trie * x = (trie*) malloc(sizeof(trie));
x->nr_fii = 0;
x->cnt = 0;
memset(x->fii, 0, sizeof(x->fii));
if(x == NULL)
{
perror("Eroare:");
exit(EXIT_FAILURE);
}
return x;
}
void insert(trie * t, const char * s)
{
if(*s == '\n')
{
t->cnt++;
}
else
{
if(t->fii[*s - 'a'] == 0)
{
t->fii[*s - 'a'] = make_trie();
t->nr_fii++;
}
insert(t->fii[*s - 'a'], s + 1);
}
}
int del(trie * t, const char * s)
{
if(*s == '\n')
{
t->cnt--;
}
else
{
if(del(t->fii[*s - 'a'], s + 1) == 1)
{
t->fii[*s - 'a'] = 0;
t->nr_fii --;
}
}
if(t->nr_fii == 0 && t->cnt == 0 && t != radacina)
{
free(t);
t = NULL;
return 1;
}
return 0;
}
int numara(trie * t, const char * s)
{
if(*s == '\n')
{
return t->cnt;
}
else
{
if(t->fii[*s - 'a'] == NULL)
{
return 0;
}
else
{
return numara(t->fii[*s - 'a'], s + 1);
}
}
}
int prefix(trie * t, const char * s, int k)
{
if(*s == '\n' || t->fii[*s - 'a'] == NULL)
{
return k;
}
else
{
return prefix(t->fii[*s - 'a'], s + 1, k + 1);
}
}
int main()
{
char s[35];
FILE * in = fopen("trie.in", "r");
FILE * out = fopen("trie.out", "w");
radacina = make_trie();
fgets(s, 35, in);
while(!feof(in))
{
//printf(s);
switch(s[0])
{
case '0': insert(radacina, s + 2); break;
case '1': del(radacina, s + 2); break;
case '2': fprintf(out, "%d\n", numara(radacina, s + 2));break;
case '3':fprintf(out, "%d\n", prefix(radacina, s + 2, 0));
}
fgets(s, 35, in);
}
return 0;
}