Pagini recente » Cod sursa (job #1244539) | Cod sursa (job #2740140) | Cod sursa (job #1567181) | Cod sursa (job #287744) | Cod sursa (job #2341640)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
struct nod_trie{
int nr_cuv;
int nr_fii;
nod_trie* fii[25];
// Constructor
nod_trie() {
// Initializeaza numarul de cuvinte din nodul curent
nr_cuv = 0;
nr_fii = 0;
// Seteaza campurile de la 'fii' la 'fii + sizeof(fii)' cu 0
memset(fii, 0, sizeof(fii));
}
};
nod_trie* root = new nod_trie();
void citire();
void add_word(nod_trie* nod, char* cuv) {
// Daca pointerul catre litera curenta e NULL (adica, daca am ajuns la
// capatul cuvantului) incrementeaza contorul nodului curent, deoarece
// s-a adugat complet un nou cuvant
if (*cuv == NULL) {
nod -> nr_cuv++;
return;
}
short delta = *cuv - 'a';
// Daca nu e creat nodul care duce in caracterul 'delta'
if(nod -> fii[delta] == NULL){
// Cream un nou nod trie;
nod -> fii[delta] = new nod_trie();
nod -> nr_fii++;
}
// Reapeleaza functia de adaugare, cu 'cuv+1', adica
add_word(nod -> fii[delta], cuv + 1);
}
int find_word(nod_trie* nod, char* cuv) {
if (*cuv == NULL) {
return nod -> nr_cuv;
}
short delta = *cuv - 'a';
if(nod -> fii[delta] == NULL){
return 0;
}
// Reapeleaza functia de cautare a cuvantului
find_word(nod -> fii[delta], cuv + 1);
}
// Se apeleaza cu un pointer catre nod si catre char
int delete_word(nod_trie* nod, char* cuv) {
// Daca am ajuns la capatul cuvantului
if (*cuv == NULL) {
// Decrementam numarul de cuvinte
nod -> nr_cuv--;
if (nod -> nr_cuv == 0 && nod -> nr_fii == 0 && nod != root) {
delete nod;
return 1;
}
return 0;
}
short delta = *cuv - 'a';
if (delete_word(nod -> fii[delta], cuv+1)) {
nod -> nr_fii--;
// Facem pointerul catre
nod -> fii[delta] = 0;
// Verificam si nodul curent, sa vedem daca
if (nod -> nr_cuv == 0 && nod -> nr_fii == 0 && nod != root) {
delete nod;
return 1;
}
}
return 0;
}
int prefix(nod_trie* nod, char* cuv) {
if (*cuv == 0) {
return 0;
}
// Transformam literele de la a la z in cifre dela 1 la 27
short delta = *cuv - 'a';
if (nod -> fii[delta] == 0) {
return 0;
}
return 1 + prefix(nod -> fii[delta], cuv+1);
}
int main()
{
int nr;
char cuv[22];
while(!f.eof()) {
f >> nr;
f >> cuv;
if (f.eof())
break;
if (nr == 0) {
add_word(root, cuv);
}
else if (nr == 1) {
delete_word(root, cuv);
}
else if (nr == 2) {
g << find_word(root, cuv) << '\n';
}
else if (nr == 3) {
g << prefix(root, cuv) << '\n';
}
//cout << cuv << '\n';
}
return 0;
}