Cod sursa(job #2280557)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 10 noiembrie 2018 20:30:36
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.5 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;

#define index (sir[0]-'a')

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");
//ifstream input("test20.in");
ofstream output("trie.out");

int main(){
	
	//freopen("trie.in","rt",stdin);
	//freopen("test20.in","rt",stdin);
	//freopen("trie.out","wt",stdout);
	
	root=new nod;
	
	int tip;
	char cuv[21];
	
	//while( !feof( stdin ) ) {
	while( input >> tip >> cuv){

		//scanf("%c %s\n",&tip,&line);
		
		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";
				//printf("%d\n",count(line));
				break;
			case 3: // lungime prefix maxim
				output << prefix(cuv) << "\n";
				//printf("%d\n",prefix(line));
				break;
		}
	}
	
	input.close();
	output.close();

	return 0;
}