Cod sursa(job #2280460)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 10 noiembrie 2018 17:39:18
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include<stdio.h>
#include <cstring>

using namespace std;

#define MAXL 20
#define ALFSIZE 26

typedef struct nod{
	int freq, nbfii;
	nod* fii[ALFSIZE];
	nod() {
		freq = nbfii = 0;
		memset( fii, NULL, sizeof( fii ) );
	}
}nod;

nod* root;

#define index sir[0]-'a'

void addcuv(char* sir){
	nod* crt=root;
	while(sir[0]){
		if(crt->fii[index]==NULL){
			nod* aux=new nod;
			crt->fii[index]=aux;
			crt->nbfii++;
			crt=aux;
		}
		else{
			crt=crt->fii[index];
		}
		sir++;
	}
	// ultimul caracter
	crt->freq++;
}

bool removecuv(char* sir,nod* p){
	if(sir[0]==0){
		p->freq--;
	}
	else{
		bool del=removecuv(sir+1,p->fii[index]);
		if(del){
			p->fii[index]=NULL;
			p->nbfii--;
		}
	}

	if(p->freq==0 && p->nbfii==0 && p!=root){
			delete p;
			return true;
	}
	else
		return false;
}

int count(char* sir){
	nod* crt=root;
	while(sir[0]){
		if(crt->fii[index]==NULL){
			return 0;
		}
		else{
			crt=crt->fii[index];
		}
		sir++;
	}
	// am parcurs tot sirul
	return crt->freq;
}

int prefix(char* sir){
	nod* crt=root;
	int prefix=0;
	while(sir[0]){
		if(crt->fii[index]==NULL){
			return prefix;
		}
		else{
			crt=crt->fii[index];
			prefix++;
		}
		sir++;
	}
	return prefix;
}

int main(){
	
	//freopen("trie.in","rt",stdin);
	freopen("test20.in","rt",stdin);
	freopen("trie.out","wt",stdout);
	
	root=new nod;
	
	int tip,rez;
	char cuv[MAXL+1];

	while( !feof( stdin ) ) {
		scanf("%d %s\n",&tip,&cuv);

		switch(tip){
			case 0: // adauga o aparitie
				addcuv(cuv);
				break;
			case 1: // sterge o aparitie
				removecuv(cuv,root);
				break;
			case 2: // numarul de aparitii
				rez=count(cuv);
				printf("%d\n",rez);
				break;
			case 3: // lungime prefix maxim
				rez=prefix(cuv);
				printf("%d\n",rez);
				break;
		}
	}
	
	return 0;
}