Pagini recente » Cod sursa (job #3162950) | Cod sursa (job #2931232) | Cod sursa (job #1560994) | Cod sursa (job #1027919) | Cod sursa (job #2064650)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
typedef struct element{
int info, nr;
element * urm[21];
}NOD;
NOD * arbore;
void initializare(){
arbore -> info = 0;
arbore -> nr = 0;
memset(arbore -> urm , 0, sizeof(arbore -> urm));
}
void adaugareArbore(NOD *parcurg, char x[21], int poz) {
if(x[poz] == '\0'){//am ajuns la sf unui cuvant
parcurg -> info ++;
return;
}
if(parcurg ->urm[x[poz] - 'a'] == 0){//se shimba prefixul -> construim o alta ramura
parcurg -> nr ++;
parcurg->urm[x[poz] - 'a'] = new element;//x[poz] - 'a' transform in numar
}
adaugareArbore(parcurg -> urm[x[poz] - 'a'], x, poz + 1);
}
int stergereArbore(NOD *parcurg, char x[21], int poz){
if(x[poz] == '\0'){
parcurg -> info--;
}else if(stergereArbore(parcurg->urm[x[poz] - 'a'],x , poz + 1)){
parcurg -> nr --;
parcurg -> urm[x[poz] - 'a'] = 0;
}
if(parcurg -> nr == 0 && parcurg -> info == 0 && parcurg != arbore){
delete(parcurg);
return 1;
}
return 0;
}
void tiparire(NOD * parcurg, char x[21], int poz){
if(x[poz] == '\0'){
out << parcurg -> info <<'\n';
}else{
tiparire(parcurg -> urm[x[poz] - 'a'],x , poz + 1);
}
}
int lungimePrefix(NOD * parcurg, char x[21], int poz){
if(x[poz] == '\0' || parcurg -> urm[x[poz] - 'a'] == 0){
return 0;
}else{
return 1 + lungimePrefix(parcurg -> urm[x[poz] - 'a'], x, poz + 1);
}
}
void rezolvare(int operatie, char cuv[21]){
if(operatie == 0){
adaugareArbore(arbore, cuv, 0);
}else if(operatie == 1){
stergereArbore(arbore, cuv, 0);
}else if(operatie == 2){
tiparire(arbore, cuv, 0);
}else{
out << lungimePrefix(arbore, cuv, 0) << '\n';
}
}
void citire(){
int operatie;
char cuv[21];
arbore = new NOD;
initializare();
while(in >> operatie >> cuv){
rezolvare(operatie, cuv);
}
}
int main() {
citire();
return 0;
}