Pagini recente » Cod sursa (job #486412) | Cod sursa (job #2450195) | Cod sursa (job #1944040) | Cod sursa (job #2647387) | Cod sursa (job #2064785)
#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[30];
}NOD;
NOD * arbore;
void adaugareArbore(NOD *parcurg, char x[30], int poz) {
if(x[poz] == '\0'){//am ajuns la sf unui cuvant
parcurg -> info ++;
return;
}
if(parcurg ->urm[x[poz] - 'a' + 1] == 0){//se shimba prefixul -> construim o alta ramura
parcurg -> nr ++;
parcurg->urm[x[poz] - 'a' + 1] = new element;//x[poz] - 'a' transform in numar
}
adaugareArbore(parcurg -> urm[x[poz] - 'a' + 1], x, poz + 1);
}
int stergereArbore(NOD *parcurg, char x[30], int poz){
if(x[poz] == '\0'){
parcurg -> info--;
}else if(stergereArbore(parcurg->urm[x[poz] - 'a' + 1],x , poz + 1)){
parcurg -> nr --;
parcurg -> urm[x[poz] - 'a' + 1] = 0;
}
if(parcurg -> nr == 0 && parcurg -> info == 0 && parcurg != arbore){
delete(parcurg);
return 1;
}
return 0;
}
int tiparire(NOD * parcurg, char x[30], int poz){
if(x[poz] == '\0'){
return parcurg -> info ;
}
if(parcurg -> urm[x[poz] - 'a' + 1] != 0){
tiparire(parcurg -> urm[x[poz] - 'a' + 1],x , poz + 1);
}
}
int lungimePrefix(NOD * parcurg, char x[21], int poz){
if(x[poz] == '\0' || parcurg -> urm[x[poz] - 'a' + 1] == 0){
return 0;
}else{
return 1 + lungimePrefix(parcurg -> urm[x[poz] - 'a' + 1], x, poz + 1);
}
}
void rezolvare(int operatie, char cuv[30]){
if(operatie == 0){
adaugareArbore(arbore, cuv, 0);
}else if(operatie == 1){
stergereArbore(arbore, cuv, 0);
}else if(operatie == 2){
out << tiparire(arbore, cuv, 0) <<'\n';
}else{
out << lungimePrefix(arbore, cuv, 0) << '\n';
}
}
void citire(){
int operatie;
char cuv[30];
arbore = new NOD;
while(in >> operatie >> cuv){
rezolvare(operatie, cuv);
}
}
int main() {
citire();
return 0;
}