Cod sursa(job #795053)

Utilizator Alexxino7Alexandru Popescu Alexxino7 Data 7 octombrie 2012 15:36:30
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<fstream>
#include<iostream>
#include<cstring>
#include<string>
#include<cassert>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");
string::iterator it;

struct Trie{
	int words,nrfii;
	Trie *son[26];
	Trie(){
		words=nrfii=0;
		memset(son,0,sizeof(son));
	}
};

Trie *T = new Trie;

void add(Trie *nod,string::iterator it){
	if(*it=='\0'){
		nod->words++;
		return;
	}
	
	//assert(0<=*it-'a' && *it-'a'<=25);
	
	if(nod->son[*it-'a']==0){
		nod->son[*it-'a'] = new Trie;
		nod->nrfii++;
	}
	//assert(nod->son[*it-'a']!=0);
	add(nod->son[*it-'a'],it+1);
}

bool del(Trie *nod,string::iterator it){
	if(*it == '\0'){
		if(nod->nrfii || nod->words>1)
			return 0;
		delete nod;
		return 1;
	}
	
	//assert(0<=*it-'a' && *it-'a'<=25);
	//assert(nod->son[*it-'a']!=0);
	if( del(nod->son[*it-'a'],it+1) ){
		nod->nrfii--;
		//assert(0<=*it-'a' && *it-'a'<=25);
		nod->son[*it-'a']=0;
		if(nod->nrfii || nod->words)
			return 0;
		delete nod;
		return 1;
	}
	return 0;
}

int nrap(Trie *nod,string::iterator it){
	if(*it=='\0')
		return nod->words;
	//assert(0<=*it-'a' && *it-'a'<=25);
	//assert(nod->son[*it-'a']!=0);
	return nrap(nod->son[*it-'a'],it+1);
}

int lgpr(Trie *nod,string::iterator it){
	//assert(0<=*it-'a' && *it-'a'<=25);
	if(*it!='\0' && nod->son[*it-'a']){
		//assert(nod->son[*it-'a']!=0 || *it=='\0');
		return 1+lgpr(nod->son[*it-'a'],it+1);
	}
	return 0;
}

int main(){
	
	int cod;
	string w;
	
	while(!fin.eof()){
		fin>>cod>>w;
		it=w.begin();
		
		if(cod==0){
			add(T,it);
		}
		if(cod==1){
			del(T,it);
		}
		if(cod==2){
			fout<<nrap(T,it)<<'\n';
		}
		if(cod==3){
			fout<<lgpr(T,it)<<'\n';
		}
		cod=4;
	}
	
	fin.close();
	fout.close();
	return 0;
}