Pagini recente » Cod sursa (job #3206773) | Cod sursa (job #163588) | Cod sursa (job #538801) | Cod sursa (job #446557) | Cod sursa (job #2089201)
#define DM 21
#include <cstring>
#include <fstream>
using namespace std;
ifstream fi ("trie.in");
ofstream fo ("trie.out");
char s[DM];//cuvant
int o;//tipul de operatie
struct trie
{
int cnt, nr;//nr de cuvinte ce se termina in nod, nr de fii
trie *fiu[27];//fiii nodului
trie()//build
{
cnt = nr = 0;//0 cuvinte terminate
memset(fiu, 0, sizeof(fiu));//niciun fiu
}
};
trie *root = new trie();
//pt a adauga un cuvant ii bag toate caracterele in noduri
void add(char *c, trie *nod)//adaug un nod
{
if (*c == 0)//daca am ajuns la capatul cuvantului, crestem cnt
{
++nod->cnt;
return;
}
int delta = *c - 'a';//pozitia caracterului in vectorul de fii
if (nod->fiu[delta] == 0)//daca nu exista fiu, il construim
{
nod->fiu[delta] = new trie();
++nod->nr;
}
add(c + 1, nod->fiu[delta]);//urmatorul caracter
}
bool del(trie *nod, char *c)//sterg un cuvant
{
if (*c == 0)//scoatem cuvantul
{
--nod->cnt;//scadem contorul nodului
if (nod->nr == 0 && nod->cnt == 0 && nod != root)
{
delete nod;//ce face delete?
return 1;
}
return 0;
}
int delta = *c - 'a';
if (del(nod->fiu[delta], c + 1))
{
--nod->nr;
nod->fiu[delta] = 0;
if (nod->nr == 0 && nod->cnt == 0 && nod != root)
{
delete nod;
return 1;
}
}
return 0;
}
//pt a cauta un cuvant ii caut toate caracterele pe rand
int fnd(trie *nod, char *c)//interogheaza un nod
{
if (*c == 0)//am terminat caracterele cuvantului de cautat
return nod->cnt;//cate cuvinte se termina in nodul curent
int delta = *c - 'a';
if (nod->fiu[delta] == 0)//*c != 0 => mai avem nevoie de caractere, nod->fiu[delta] == 0 => nu mai avem caracetere dupa nod
return 0;
return fnd(nod->fiu[delta], c + 1);
}
int pfx(trie *nod, char *a)
{
if (*a == 0)
return 0;
int delta = *a - 'a';
if (nod->fiu[delta] == 0)
return 0;
return 1 + pfx(nod->fiu[delta], a + 1);
}
int main()
{
while (fi >> o)//cat timp pot lua comenzi
{
fi >> s;//citesc cuvantul
if (o == 0)
add(s, root);
if (o == 1)
del(root, s);
if (o == 2)
fo << fnd(root, s) << '\n';
if (o == 3)
fo << pfx(root, s) << '\n';
}
}