Cod sursa(job #2280167)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 10 noiembrie 2018 12:22:26
Problema Trie Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.97 kb
#include<stdio.h>
#include<string.h>

#include <cstring>

using namespace std;

#define MAXL 20
#define ALFSIZE 26

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

nod* root;

void add(char* sir){
	int l=strlen(sir);
	nod* crt=root;
	int index;
	for(int i=0;i<l-1;i++){
		crt->nbcuv++;
		index=sir[i]-'a';
		if(crt->fii[index]==NULL){
			nod* aux=new nod;
			crt->fii[index]=aux;
			crt=aux;
		}
		else{
			crt=crt->fii[index];
		}
	}
	// ultimul caracter
	crt->nbcuv++;
	index=sir[l-1]-'a';
	if(crt->fii[index]==NULL){
		nod* aux=new nod;
		crt->fii[index]=aux;
		aux->freq=1;
		aux->nbcuv=1;
	}
	else{
		crt=crt->fii[index];
		crt->freq++;
		crt->nbcuv++;
	}
}

void remove(char* sir){
	int l=strlen(sir);
	nod* crt=root, *parent=NULL;
	int index;
	for(int i=0;i<l;i++){
		index=sir[i]-'a';
		parent=crt;
		crt=crt->fii[index];

		crt->nbcuv--;
		if(crt->nbcuv==0){
			// stergem ramura
			parent->fii[index]=NULL;
			for(int j=i+1;j<l;j++){
				index=sir[j]-'a';
				parent=crt;
				crt=crt->fii[index];
				delete parent;
			}
			delete crt;
			return;
		}
	}
	crt->freq--;
}

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

int prefix(char* sir){
	int l=strlen(sir);
	nod* crt=root;
	int index,prefix=0;
	for(int i=0;i<l;i++){
		index=sir[i]-'a';
		if(crt->fii[index]==NULL){
			return prefix;
		}
		else{
			crt=crt->fii[index];
			prefix++;
		}
	}
	return prefix;
}


//ifstream input("trie.in");
//ifstream input("test13.in");
//ofstream output("trie.out");

int main(){
	
	freopen("trie.in","rt",stdin);
	freopen("trie.out","wt",stdout);
	
	root=new nod;
	root->freq=0;
	root->nbcuv=0;
	for(int j=0;j<ALFSIZE;j++)
		root->fii[j]=NULL;

	int tip,rez;
	char cuv[MAXL+1];

	//char line[32];
	
	//fgets( line, 32, stdin );
 
	while( !feof( stdin ) ) {
		scanf("%d %s",&tip,&cuv);	
		switch(tip){
			case 0: // adauga o aparitie
				add(cuv);
				break;
			case 1: // sterge o aparitie
				remove(cuv);
				break;
			case 2: // numarul de aparitii
				rez=count(cuv);
				printf("%d\n",rez);
				//output << rez << endl;
				break;
			case 3: // lungime prefix maxim
				rez=prefix(cuv);
				//output << rez << endl;
				printf("%d\n",rez);
				break;
		}
	}

	/*
	while (input >> tip >> cuv) {
		switch(tip){
			case 0: // adauga o aparitie
				add(cuv);
				break;
			case 1: // sterge o aparitie
				remove(cuv);
				break;
			case 2: // numarul de aparitii
				rez=count(cuv);
				output << rez << endl;
				break;
			case 3: // lungime prefix maxim
				rez=prefix(cuv);
				output << rez << endl;
				break;
		}
	}
	*/
	
	//input.close();
	//output.close();
	
	return 0;
}