Pagini recente » Cod sursa (job #939938) | Rating Trial and Error (dannywox969) | Cod sursa (job #943915) | Cod sursa (job #147002) | Cod sursa (job #3257515)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int carMax = 26;
struct Nod {
Nod *fii[27];
int nrf, fr;
Nod() {
nrf = fr = 0;
for(int i = 0; i < carMax; i++) fii[i] = nullptr;
}
~Nod() {
for(int i = 0; i < carMax; i++) delete fii[i];
}
} *rad;
char c[102];
int op, m;
static inline void Insert(char *p, int l, Nod *nod = rad) {
if(l == 0) {
nod->fr++;
return;
}
int c = *p - 'a';
if(nod->fii[c] == nullptr) {
nod->fii[c] = new Nod();
nod->nrf++;
}
Insert(p + 1, l - 1, nod->fii[c]);
}
static inline bool Delete(char *p, int l, Nod *nod = rad) {
if(l == 0) {
nod->fr--;
if(nod->fr == 0) {
nod->nrf--;
if(nod->nrf <= 0 && nod != rad) {
delete nod;
return true;
}
}
return false;
}
int c = *p - 'a';
if(nod->fii[c] == nullptr) return false;
if(Delete(p + 1, l - 1, nod->fii[c])) {
nod->nrf--;
nod->fii[c] = nullptr;
if(nod->nrf <= 0 && nod != rad) {
delete nod;
return true;
}
}
return false;
}
static inline int Frecv(char *p, int l, Nod *nod = rad) {
if(l == 0) return nod->fr;
int c = *p - 'a';
if(nod->fii[c] == nullptr) return 0;
return Frecv(p + 1, l - 1, nod->fii[c]);
}
static inline int Lung(char *p, int l, int niv = 0, Nod *nod = rad) {
if(l == 0) return niv;
int c = *p - 'a';
if(nod->fii[c] == nullptr) return niv;
return Lung(p + 1, l - 1, niv + 1, nod->fii[c]);
}
int main() {
rad = new Nod();
while(fin >> op >> c) {
m = strlen(c);
if(op == 0) Insert(c, m);
if(op == 1) Delete(c, m);
if(op == 2) fout << Frecv(c, m) << "\n";
if(op == 3) fout << Lung(c, m) << "\n";
}
return 0;
}