Pagini recente » Cod sursa (job #487255) | Cod sursa (job #402401)
Cod sursa(job #402401)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CARD_SIGMA ('Z' - 'A' + 1)
struct nod
{
nod* fii[CARD_SIGMA];
int nrcuv; //numar de cuvinte care se termina pe aceasta pozitie
int nrfii; //numar de cuvinte care continua din aceasta pozitie
nod()
{
int i;
for(i = 0; i < CARD_SIGMA; ++i) fii[i] = NULL;
nrcuv = nrfii = 0;
}
};
nod* radacina;
void adaugaCuvant(nod* trie, char* s)
{
if(*s == '\0')
{
trie -> nrcuv++;
}
else
{
if(trie -> fii[*s - 'a'] == NULL)
trie -> fii[*s - 'a'] = new nod;
adaugaCuvant(trie -> fii[*s - 'a'], s + 1);
trie -> nrfii++;
}
}
void stergeCuvant(nod* &trie, char* s)
{
int i;
if(*s == '\0')
{
if(trie -> nrcuv > 1) trie -> nrcuv--;
else
{
delete trie;
trie = NULL;
}
return;
}
else
{
stergeCuvant(trie -> fii[*s - 'a'], s + 1);
trie -> nrfii--;
}
if(trie -> nrfii == 0 && trie -> nrcuv == 0)
{
delete trie;
trie = NULL;
}
}
int aparitii(nod* trie, char* s)
{
if(*s == '\0') return trie -> nrcuv;
else
{
if(trie -> fii[*s - 'a'] == NULL) return 0;
else return aparitii(trie -> fii[*s - 'a'], s + 1);
}
}
int prefix(nod* trie, char* s)
{
if(*s == '\0' || trie -> fii[*s - 'a'] == NULL) return 0;
return prefix(trie -> fii[*s - 'a'], s + 1) + 1;
return 0;
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
char s[50];
int codOp;
radacina = new nod;
while(!feof(stdin))
{
scanf("%d%s\n", &codOp, s);
if(codOp == 0) adaugaCuvant(radacina, s);
if(codOp == 1) stergeCuvant(radacina, s);
if(codOp == 2) printf("%d\n", aparitii(radacina, s));
if(codOp == 3) printf("%d\n", prefix(radacina, s));
}
return 0;
}