Cod sursa(job #2280579)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 10 noiembrie 2018 21:04:36
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include<stdio.h>
#include <cstring>
#include <fstream>
#include <iostream>

#include<map>
#include <utility> 

using namespace std;

#define MAXL 20

typedef struct nod{
	int freq, nbfii;
	map<unsigned char,nod*> fii; 
	nod() {
		freq = nbfii = 0;
	}
}nod;

nod* root;

void addcuv(char* sir){
	nod* crt=root, *aux;
	map<unsigned char,nod*>::iterator it;
	while(sir[0]){
		it=crt->fii.find(sir[0]);
		if(it==crt->fii.end()){
			aux=new nod;
			crt->fii.insert(make_pair(sir[0],aux)); 
			crt->nbfii++;
			crt=aux;
		}
		else{
			crt=it->second;
		}
		sir++;
	}
	// ultimul caracter
	crt->freq++;
}

bool removecuv(char* sir,nod* p){
	if(sir[0]==0){
		p->freq--;
	}
	else{
		map<unsigned char,nod*>::iterator it;
		it=p->fii.find(sir[0]);
		bool del=removecuv(sir+1,it->second);
		if(del){
			p->fii.erase(it);
			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;
	map<unsigned char,nod*>::iterator it;
	while(sir[0]){
		it=crt->fii.find(sir[0]);
		if(it==crt->fii.end()){
			return 0;
		}
		else{
			crt=it->second;
		}
		sir++;
	}
	// am parcurs tot sirul
	return crt->freq;
}

int prefix(char* sir){
	nod* crt=root;
	int prefix=0;
	map<unsigned char,nod*>::iterator it;
	while(sir[0]){
		it=crt->fii.find(sir[0]);
		if(it==crt->fii.end()){
			return prefix;
		}
		else{
			crt=it->second;
			prefix++;
		}
		sir++;
	}
	return prefix;
}

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

int main(){
	
	root=new nod;
	
	int tip;
	char cuv[21];

	while( input >> 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
				output << count(cuv) << "\n";
				break;
			case 3: // lungime prefix maxim
				output << prefix(cuv) << "\n";
				break;
		}
	}
	
	input.close();
	output.close();

	return 0;
}