Cod sursa(job #2753229)

Utilizator Mirc100Mircea Octavian Mirc100 Data 21 mai 2021 18:22:56
Problema Trie Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#define nr_lit 'z'-'a'+1 
#include<fstream>
#include<iostream>
using namespace std;
struct varf{
	varf* fii[nr_lit];
	int frecv,nr_fii;
};
varf *t;
varf* creeaza_nod(){
	varf *t;
	int i;
	t=new varf;
	t->nr_fii=0;
	t->frecv=0;
	for(i=0;i<nr_lit;i++)
		t->fii[i]=NULL;
	return t;
}

void adauga(char w[21],varf *t){
 
	if(w[0]!=0){
		int lit=w[0]-'a';
		if (t->fii[lit]==NULL){
			t->fii[lit]=creeaza_nod();	
			t->nr_fii++;
		}
		adauga(w+1,t->fii[lit]);
	}
	else
		t->frecv++;
}
void adauga(char w[21]){
	adauga(w,t);
}

int sterge(char w[21],varf *&t){
	if(w[0]!=0){
		int lit=w[0]-'a';
		
		if (t->fii[lit]==NULL)
			return 0;
		int x=sterge(w+1,t->fii[lit]);
		if(x==1){
			t->fii[lit]=NULL;
			t->nr_fii--;
			if(t->frecv==0 && t->nr_fii==0){
				delete t;
				return 1;
			}
		}
		return 0;
	}
	else{
		t->frecv--;
		if(t->frecv==0 && t->nr_fii==0){
			delete t;
			return 1;
		}
		
	}
	return 0;
}

void sterge(char w[21]){
	sterge(w,t);
}


int nr_aparitii(char w[21],varf *t){

	int lit=w[0]-'a';
	if(w[0]!=0){
		if(t->fii[lit]==NULL)
			return 0;
		return nr_aparitii(w+1,t->fii[lit]);
	}
	else
		return t->frecv;
}

int nr_aparitii(char w[21]){
	return nr_aparitii(w,t);
}

int lungime_prefix_comun(char w[21], varf *t){
	
	int lit=w[0]-'a';
	if(w[0]!=0){
		if(t->fii[lit]==NULL)
			return 0;
		return 1+lungime_prefix_comun(w+1,t->fii[lit]);
	}
	else
		return 0;
}

int lungime_prefix_comun(char w[21]){
	return lungime_prefix_comun(w,t);
}

int main(){
	
	ifstream f("trie.in");
	ofstream h("trie.out");
	int x;
	char w[21];
	t=creeaza_nod();
	while(f>>x>>w){
		switch(x){
			case 0: adauga(w);break;
			case 1: sterge(w);break;
			case 2: h<<nr_aparitii(w)<<endl; break;
			case 3: h<<lungime_prefix_comun(w)<<endl;
		}
	}
	f.close();
	h.close();
	
}