Pagini recente » Monitorul de evaluare | Cod sursa (job #885144) | Cod sursa (job #1278029) | Cod sursa (job #1726333) | Cod sursa (job #1720693)
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie{
int nnod, nap;
trie *vec[30];
trie(){
nnod = nap = 0;
memset(vec, 0, sizeof(vec));
}
};
trie *inc = new trie;
void adauga(trie *T, char *k){
int care = *k - 'a';
if (!(*k >= 'a' && *k <= 'z')){
T -> nap++;
return;
}
if (T -> vec[care] == 0){
T -> vec[care] = new trie;
T -> nnod++;
}
adauga(T -> vec[care], k+1);
}
bool sterge(trie *T, char *k){
int care = *k - 'a';
if (!(*k >= 'a' && *k <= 'z'))
T -> nap--;
else if (sterge(T -> vec[care], k+1)) {
T -> vec[care] = 0;
T -> nnod--;
}
if( T -> nnod == 0 && T -> nap == 0 && inc != T ) {
delete T;
return 1;
}
return 0;
}
int Lprefix(trie *T, char *k, int P){
int care = *k - 'a';
if (T -> vec[care] == 0 || !(*k >= 'a' && *k <= 'z'))
return P;
Lprefix(T -> vec[care], k+1, P+1);
}
int nrap(trie *T, char *k){
int care = *k - 'a';
if (!(*k >= 'a' && *k <= 'z'))
return T -> nap;
return nrap(T -> vec[care], k+1);
}
int main(){
char s[400];
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 << nrap(inc, s+2) << '\n';
else if (s[0] == '3'){
g << Lprefix(inc, s+2, 0) << '\n';
}
}
return 0;
}