Pagini recente » Cod sursa (job #564372) | Cod sursa (job #2107978) | Cod sursa (job #1878885) | Cod sursa (job #30517) | Cod sursa (job #2729564)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int LMAX = 20;
const int SIGMA = 26;
struct nod {
int nr_ap, capat;
nod *fii[SIGMA];
nod() : nr_ap(0), capat(0) {
for(int i = 0; i < SIGMA; i++)
fii[i] = nullptr;
}
};
void add_cuv(nod *crt, char *cuv, int l) {
crt->nr_ap++;
if(l == 0)
crt->capat++;
else {
if(!crt->fii[cuv[0] - 'a'])
crt->fii[cuv[0] - 'a'] = new nod;
add_cuv(crt->fii[cuv[0] - 'a'], cuv + 1, l - 1);
}
}
void del_cuv(nod *crt, char *cuv, int l) {
crt->nr_ap--;
if(l == 0)
crt->capat--;
else {
del_cuv(crt->fii[cuv[0] - 'a'], cuv + 1, l - 1);
if(crt->fii[cuv[0] - 'a']->nr_ap == 0) {
delete crt->fii[cuv[0] - 'a'];
crt->fii[cuv[0] - 'a'] = nullptr;
}
}
}
int get_nr_ap(nod *crt, char *cuv, int l) {
if(l == 0)
return crt->capat;
if(!crt->fii[cuv[0] - 'a'])
return 0;
return get_nr_ap(crt->fii[cuv[0] - 'a'], cuv + 1, l - 1);
}
int get_longest_prefix(nod *crt, char *cuv, int l) {
if(l == 0 || !crt->fii[cuv[0] - 'a'])
return 1;
return 1 + get_longest_prefix(crt->fii[cuv[0] - 'a'], cuv + 1, l - 1);
}
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int op;
char cuv[LMAX + 1];
nod *trie_root = new nod;
while(scanf("%d %s ", &op, cuv) != EOF) {
if(op == 0)
add_cuv(trie_root, cuv, strlen(cuv));
else if(op == 1)
del_cuv(trie_root, cuv, strlen(cuv));
else if(op == 2)
printf("%d\n", get_nr_ap(trie_root, cuv, strlen(cuv)));
else
printf("%d\n", get_longest_prefix(trie_root, cuv, strlen(cuv)) - 1);
}
return 0;
}