Cod sursa(job #402451)
#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;
trie -> nrfii++;
}
adaugaCuvant(trie -> fii[*s - 'a'], s + 1);
}
}
int stergeCuvant(nod* trie, char* s)
{
if( *s == '\0') trie -> nrcuv--;
else if(stergeCuvant(trie -> fii[*s - 'a'], s + 1))
{
trie -> nrfii--;
trie -> fii[*s - 'a'] = NULL;
}
if(trie -> nrcuv == 0 && trie -> nrfii == 0 && trie != radacina)
{
delete trie;
return 1;
}
return 0;
}
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, int k)
{
if(*s == '\0' || trie -> fii[*s - 'a'] == NULL) return k;
return prefix(trie -> fii[*s - 'a'], s + 1, k + 1);
}
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, 0));
}
return 0;
}