Pagini recente » Atasamentele paginii simulare_oji_2023_clasa_10_10_martie | Monitorul de evaluare | Cod sursa (job #278545) | Profil claudiubutacu | Cod sursa (job #2008079)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
struct Trie{
Trie *fii[26];
int nrfii;
int nrcuv;
Trie() {
nrfii = nrcuv = 0;
memset(fii, 0, sizeof(fii));
}
};
Trie *radacina = new Trie;
void add(Trie *rad, char *c){
int lg = strlen(c);
for(int i = 0; i < lg; ++i){
if(rad->fii[c[i] - 'a'] == 0){
rad->fii[c[i] - 'a'] = new Trie;
rad->nrfii++;
}
rad = rad->fii[c[i] - 'a'];
}
rad->nrcuv++;
}
bool del(Trie *rad, char *c){
if (*c == 0) {
rad->nrcuv--;
if (rad->nrcuv == 0 && rad->nrfii == 0)
return true;
return false;
}
if (rad->fii[*c - 'a'] == 0) {
return false;
}
if (del(rad->fii[*c - 'a'], c + 1) == true) {
delete rad->fii[*c - 'a'];
rad->fii[*c - 'a'] = NULL;
rad->nrfii--;
}
if (rad->nrcuv == 0 && rad->nrfii == 0) {
return true;
}
return false;
}
int nrAp(Trie *rad, char *c){
int lg = strlen(c);
for(int i = 0; i < lg; ++i){
if(rad->fii[c[i] - 'a'] == 0){
return 0;
}
rad = rad->fii[c[i] - 'a'];
}
return rad->nrcuv;
}
int lcmmpc(Trie *rad, char *c){
int lg = strlen(c);
for(int i = 0; i < lg; ++i){
if(rad->fii[c[i] - 'a'] == 0){
return i;
}
rad = rad->fii[c[i] - 'a'];
}
return lg;
}
int main() {
ifstream fin("trie.in");
ofstream fout("trie.out");
int op;
while(fin >> op){
char cuv[25];
fin >> cuv;
if(op == 0){
add(radacina, cuv);
}
else if(op == 1){
del(radacina, cuv);
}
else if(op == 2){
fout << nrAp(radacina, cuv) << '\n';
}
else {
fout << lcmmpc(radacina, cuv) << '\n';
}
}
return 0;
}