Pagini recente » Rating joker (AbRaCaDaBrA) | Cod sursa (job #2446831) | Cod sursa (job #880972) | Cod sursa (job #193224) | Cod sursa (job #1720702)
#include <fstream>
#include <cstring>
#include <iostream>
#define cat *k - 'a'
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
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];
while (f.getline(s, sizeof(s))){
if (s[0] == '0')
adauga(inc, s+2);
else if (s[0] == '1')
sterge(inc, s+2);
else if (s[0] == '2')
g << na(inc, s+2) << '\n';
else if (s[0] == '3')
g << lp(inc, s+2, 0) << '\n';
}
return 0;
}