Cod sursa(job #2280352)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 10 noiembrie 2018 14:55:38
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.73 kb
#include<stdio.h>
#include<string.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;

void addcuv(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){
			nod* aux=new nod;
			crt->fii[index]=aux;
			crt->nbfii++;
			crt=aux;
		}
		else{
			crt=crt->fii[index];
		}
	}
	// ultimul caracter
	crt->freq++;
}

bool removecuv(char* sir,nod* p){
	if(sir[0]==0){
		p->freq--;
	}
	else{
		int index=sir[0]-'a';
		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){
	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 line;

int main(){
	
	freopen("trie.in","rt",stdin);
	//freopen("test9.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 );

	int err=0;
	while( !feof( stdin ) ) {
		scanf("%d %s\n",&tip,&cuv);
		line++;
		if(line==13169){
			tip=tip;
		}

		//printf("%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);
				//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;
}