Cod sursa(job #2280581)

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

#include<vector>
#include<algorithm>

using namespace std;

#define MAXL 20
#define ALFSIZE 26

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

nod* root;

vector<nod*>::iterator findcar(vector<nod*> & v,char c){
	vector<nod*>::iterator it;
	for(it=v.begin();it!=v.end();it++){
		if((*it)->car==c)
			return it;
	}
	return v.end();
}

void addcuv(char* sir){
	nod* crt=root, *aux;
	vector<nod*>::iterator it;
	while(sir[0]){
		it=findcar(crt->fii,sir[0]);
		if(it==crt->fii.end()){
			aux=new nod;
			aux->car=sir[0];
			crt->fii.push_back(aux);
			crt->nbfii++;
			crt=aux;
		}
		else{
			crt=*it;
		}
		sir++;
	}
	// ultimul caracter
	crt->freq++;
}

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

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

ifstream input("trie.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;
}