Cod sursa(job #2280142)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 10 noiembrie 2018 11:53:05
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.53 kb
#include<stdio.h>
#include<stdlib.h>

#include<fstream>
#include<iostream>

using namespace std;

#define MAXL 20
#define ALFSIZE 26

typedef struct nod{
	int freq;
	int nbcuv;
	nod* fii[ALFSIZE];
}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;
			for(int j=0;j<ALFSIZE;j++)
				aux->fii[j]=NULL;
			aux->freq=0;
			aux->nbcuv=0;
			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;
		for(int j=0;j<ALFSIZE;j++)
			aux->fii[j]=NULL;
		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, *next, *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");
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];

	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;
}