Cod sursa(job #717475)

Utilizator mr.johnFMI - Laceanu Ionut-Adrian mr.john Data 19 martie 2012 22:26:03
Problema Trie Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstring>
#include <fstream>

using namespace std;

struct nod{
	nod *v[26];
	int fii;
	int nr;
	nod(){
		fii=nr=0;
		memset(v,0,sizeof(v) );
	}
};

nod *T=new nod;

void adaug(nod *t,char *s){
	if(!*s){
		t->nr++;
		return;
	}
	if(t->v[*s-'a']==0){
		t->v[*s-'a']=new nod;
		t->fii++;
	}
	adaug(t->v[*s-'a'],s+1);
}

int del(nod *t,char*s){
	if (!*s)
		t->nr--;
	else 
		if (del(t->v[*s-'a'],s+1)){
			t->v[*s-'a']=0;
			t->fii--;
		}
	if (!t->nr && !t->fii && t!=T){
		delete t; return 1;
	}
	return 0;
}

int query(nod *t, char *s){
	if (!*s)
		return t->nr;
	if (t->v[*s-'a'])
		return query(t->v[*s-'a'],s+1);
	return 0;
}	
int prefix(nod *t,char *s,int i){
	if (!*s || !t->v[*s-'a'])
		return i;
	return prefix(t->v[*s-'a'],s+1,i+1);
}

int main ()
{
	ifstream fin("trie.in");
	ofstream fout("trie.out");
	int op;
	char c[21];
	fin>>op>>c;
	while(!fin.eof()){
		if (op==0) adaug(T,c);
		else if (op==1) del(T,c);
		else if (op==2) fout<<query(T,c)<<endl;
		else if (op==3) fout<<prefix(T,c,0)<<endl;
		fin>>op>>c;
	}
	fin.close();
	return 0;
}