Pagini recente » Cod sursa (job #372187) | Cod sursa (job #3247177) | Cod sursa (job #1316) | Cod sursa (job #3279192) | Cod sursa (job #3276920)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie {
int count = 0;
int numar_fii = 0;
trie* litere[26] = {nullptr};
};
void add_to_trie(trie* nod, const char* word) {
if (word[0] == '\0') {
nod->count++;
return;
}
int letter_index = word[0] - 'a';
if (nod->litere[letter_index] == nullptr) {
nod->litere[letter_index] = new trie();
nod->numar_fii++;
}
add_to_trie(nod->litere[letter_index], word + 1);
}
void remove_from_trie(trie* nod, const char* word) {
if (word[0] == '\0') {
nod->count--;
return;
}
int letter_index = word[0] - 'a';
if (nod->litere[letter_index] == nullptr) return;
remove_from_trie(nod->litere[letter_index], word + 1);
if (nod->litere[letter_index]->numar_fii == 0 && nod->litere[letter_index]->count == 0) {
delete nod->litere[letter_index];
nod->litere[letter_index] = nullptr;
nod->numar_fii--;
}
}
int how_many_in_trie(trie* nod, const char* word) {
if (word[0] == '\0') {
return nod->count;
}
int letter_index = word[0] - 'a';
if (nod->litere[letter_index] == nullptr) return 0;
return how_many_in_trie(nod->litere[letter_index], word + 1);
}
int longest_common_prefix(trie* nod, const char* word) {
if (word[0] == '\0' || nod->litere[word[0] - 'a'] == nullptr) {
return 0;
}
return 1 + longest_common_prefix(nod->litere[word[0] - 'a'], word + 1);
}
int main() {
fin.tie(0); fin.sync_with_stdio(false);
trie* root = new trie();
int op;
char cuvant[25];
while (fin >> op >> cuvant) {
if (op == 0) {
add_to_trie(root, cuvant);
} else if (op == 1) {
remove_from_trie(root, cuvant);
} else if (op == 2) {
fout << how_many_in_trie(root, cuvant) << '\n';
} else if (op == 3) {
fout << longest_common_prefix(root, cuvant) << '\n';
}
}
return 0;
}