Pagini recente » Cod sursa (job #2399034) | Cod sursa (job #226615) | Cod sursa (job #199608) | Cod sursa (job #3152008) | Cod sursa (job #2729701)
/// functiile implementate iterativ
#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) {
for(int i = 0; i <= l; i++) {
if(i > 0)
crt->nr_ap++;
if(i == l)
crt->capat++;
else {
if(!crt->fii[cuv[i] - 'a'])
crt->fii[cuv[i] - 'a'] = new nod;
crt = crt->fii[cuv[i] - 'a'];
}
}
}
void del_cuv(nod *crt, char *cuv, int l) {
nod *ccrt = crt;
for(int i = 0; i <= l; i++) {
if(i > 0)
crt->nr_ap--;
if(i == l)
crt->capat--;
else
crt = crt->fii[cuv[i] - 'a'];
}
nod *urm;
crt = ccrt;
for(int i = 0; i <= l; i++) {
if(i < l) {
urm = crt->fii[cuv[i] - 'a'];
if(crt->fii[cuv[i] - 'a']->nr_ap == 0)
crt->fii[cuv[i] - 'a'] = nullptr;
}
if(i > 0 && crt->nr_ap == 0)
delete crt;
if(i < l)
crt = urm;
}
}
int get_nr_ap(nod *crt, char *cuv, int l) {
for(int i = 0; i <= l; i++) {
if(i == l)
return crt->capat;
if(!crt->fii[cuv[i] - 'a'])
return 0;
crt = crt->fii[cuv[i] - 'a'];
}
}
int get_longest_prefix(nod *crt, char *cuv, int l) {
int l_pref = 0;
for(int i = 0; i <= l; i++) {
if(i > 0)
l_pref++;
if(i == l || !crt->fii[cuv[i] - 'a'])
return l_pref;
crt = crt->fii[cuv[i] - 'a'];
}
}
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)));
}
return 0;
}