Mai intai trebuie sa te autentifici.
Cod sursa(job #3217814)
Utilizator | Data | 24 martie 2024 19:49:26 | |
---|---|---|---|
Problema | Trie | Scor | 0 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 2.51 kb |
#include <iostream>
using namespace std;
#define LMAX 20
struct Nod {
unsigned nrAp, nrSons;
Nod* lit[26];
Nod() {
nrAp = 0;
nrSons = 0;
for (unsigned i = 0; i < 26; i += 1) {
lit[i] = 0;
}
}
};
Nod* Trie;
void adauga(char* cuv) {
Nod* it = Trie;
for (unsigned i = 0; cuv[i] != 0; i += 1) {
unsigned ind = cuv[i] - 'a';
if (it->lit[ind] == nullptr) {
it->lit[ind] = new Nod;
it->nrSons += 1;
}
it = it->lit[ind];
}
it->nrAp += 1;
}
unsigned aparitii(char* cuv) {
Nod* it = Trie;
for (unsigned i = 0; cuv[i] != 0; i += 1) {
unsigned ind = cuv[i] - 'a';
if (it->lit[ind] == nullptr) {
return 0;
}
it = it->lit[ind];
}
return it->nrAp;
}
void sterge(char* cuv) {
Nod* it = Trie;
Nod* last_needed = Trie;
unsigned del = 0;
for (unsigned i = 0; cuv[i] != 0; i += 1) {
unsigned ind = cuv[i] - 'a';
if (it->nrSons > 0 || it->nrAp > 0) {
last_needed = it;
del = i;
}
it = it->lit[ind];
}
it->nrAp -= 1;
if (it->nrAp > 0 || it->nrSons > 0) {
return;
}
last_needed->nrSons -= 1;
it = last_needed->lit[cuv[del] - 'a'];
last_needed->lit[cuv[del] - 'a'] = nullptr;
for (unsigned i = del + 1; cuv[i] != 0; i += 1) {
unsigned ind = cuv[i] - 'a';
Nod* t = it;
it = it->lit[ind];
delete t;
}
delete it;
}
unsigned prefix(char* cuv) {
Nod* it = Trie;
unsigned i = 0;
for (i = 0; cuv[i] != 0; i += 1) {
unsigned ind = cuv[i] - 'a';
if (it->lit[ind] == nullptr) {
return i;
}
it = it->lit[ind];
}
return i;
}
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
char line[2 + LMAX + 1];
Trie = new Nod;
while (cin.getline(line, LMAX)) {
switch (line[0]) {
case '0':
adauga(line + 2);
break;
case '1':
sterge(line + 2);
break;
case '2':
cout << aparitii(line + 2) << '\n';
break;
case '3':
cout << prefix(line + 2) << '\n';
break;
default:
cout << "cod gresit\n";
}
}
return 0;
}