Cod sursa(job #824406)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 26 noiembrie 2012 16:03:03
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 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;
	}
	
	if(nod->son[*it-'a']==0){
		nod->son[*it-'a'] = new Trie;
		nod->nrfii++;
	}
	add(nod->son[*it-'a'],it+1);
}

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

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

int lgpr(Trie *nod,string::iterator it){
	if(*it!='\0' && nod->son[*it-'a']!=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;
}