Cod sursa(job #826211)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 30 noiembrie 2012 14:12:01
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

struct trie{
	int nr;
	int nf;
	trie *f[26];
	trie(){
		nr=0;
		nf=0;
		for(int i=0;i<26;i++)
			f[i]=0;
	}
}*r;
int op;
char cuv[50];
void add(unsigned int i , trie *p){
	if(i==strlen(cuv)){
		p->nr++;
		return;
	}
	int val=cuv[i]-'a';
	if(p->f[val]==0){
		trie *c;
		c=new trie;
		p->f[val]=c;
		p->nf++;
	}
	add(i+1,p->f[val]);
}

void del(unsigned int i, trie *p){
	if(i==strlen(cuv)){
		p->nr--;
		return;
	}
	int val=cuv[i]-'a';
	del(i+1,p->f[val]);
	if(p->f[val]->nr==0&&p->f[val]->nf==0){
		p->nf--;
		delete p->f[val];
		p->f[val]=0;
	}
}

int nr_ap(unsigned int i,trie *p){
	if(i==strlen(cuv))
		return p->nr;
	int val=cuv[i]-'a';
	if(p->f[val]==0)
		return 0;
	return nr_ap(i+1,p->f[val]);
}

int pre(unsigned int i , trie *p,int lungime){
	if(i==strlen(cuv))
		return lungime;
	if(p->nr!=0||p->nf!=0)
		lungime=i;
	int val=cuv[i]-'a';
	if(p->f[val]==0)
		return lungime;
	return pre(i+1,p->f[val],lungime);
}

int main(){
	
	r=new trie;
	
	while(!f.eof()){
		f>>op>>cuv;
		if(op==0)
			add(0,r);
		else{
			if(op==1)
				del(0,r);
			else{
				if(op==2)
					g<<nr_ap(0,r)<<"\n";
				else
					g<<pre(0,r,0)<<"\n";
			}
		}
	}
	
	
	return 0;
}