Pagini recente » Cod sursa (job #309302) | Cod sursa (job #1220051) | Cod sursa (job #1064440) | Cod sursa (job #1558106) | Cod sursa (job #2064622)
#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];
element() {
info = 0;
nr = 0;
memset(urm, 0, sizeof(urm));
}
}NOD;
NOD * arbore;
void adaugareArbore(NOD *parcurg, char x[101], 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[101], 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[101], 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[101], 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[101]){
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[101];
arbore = new NOD;
while(in >> operatie >> cuv){
rezolvare(operatie, cuv);
}
}
int main() {
citire();
return 0;
}