Pagini recente » Cod sursa (job #622131) | Cod sursa (job #308715) | Cod sursa (job #1651337) | Cod sursa (job #3195876) | Cod sursa (job #1720703)
#include <cstdio>
#include <cstring>
#include <iostream>
#define cat *k - 'a'
using namespace std;
struct trie{
int nfii = 0, nap = 0;
trie *vec[30];
trie(){
memset(vec, 0, sizeof(vec));
}
};
trie *inc = new trie;
void adauga(trie *t, char *k){
if (!(*k >= 'a' && *k <= 'z')){
t -> nap ++;
return;
}
if (t -> vec[cat] == 0){
t -> vec[cat] = new trie;
t -> nfii++;
}
adauga(t -> vec[cat], k+1);
}
bool sterge(trie *t, char *k){
if (!(*k >= 'a' && *k <= 'z')){
t -> nap--;
}
else if (sterge(t -> vec[cat], k+1)){
t -> vec[cat] = 0;
t -> nfii--;
}
if (t -> nfii == 0 && t -> nap == 0 && t != inc){
delete t;
return 1;
}
return 0;
}
int na(trie *t, char *k){
if (!(*k >= 'a' && *k <= 'z'))
return t -> nap;
return na (t -> vec[cat], k+1);
}
int lp(trie *t, char *k, int H){
if (!(*k >= 'a' && *k <= 'z') || t -> vec[cat] == 0)
return H;
if (t -> vec[cat])
return lp(t -> vec[cat], k+1, H+1);
return 0;
}
int main(){
char s[100];
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
fgets(s, 100, stdin);
while (!feof(stdin)){
if (s[0] == '0')
adauga(inc, s+2);
else if (s[0] == '1')
sterge(inc, s+2);
else if (s[0] == '2')
printf("%d\n", na(inc, s+2));
else if (s[0] == '3')
printf("%d\n", lp(inc, s+2, 0));
fgets(s, 100, stdin);
}
return 0;
}