Cod sursa(job #2280256)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 10 noiembrie 2018 13:05:01
Problema Trie Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.8 kb
#include<stdio.h>
#include<string.h>

#include <cstring>

using namespace std;

#define MAXL 20
#define ALFSIZE 26

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

nod* root;

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

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;
			parent->nbcuv--;
			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("test13.in","rt",stdin);
	freopen("trie.out","wt",stdout);
	
	root=new nod;
	
	int tip,rez;
	char cuv[MAXL+1];

	//char line[32];
	
	//fgets( line, 32, stdin );
 
	while( !feof( stdin ) ) {
		scanf("%d %s\n",&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;
}