Cod sursa(job #703428)

Utilizator b_ady20Branescu Adrian b_ady20 Data 2 martie 2012 12:24:03
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<cstdio>
#include<cstring>
#define CH (*s-'a')
using namespace std;
struct Trie{
	int cnt,nrfii;
	Trie *fiu[26];
	Trie(){
		cnt=nrfii=0;
		memset(fiu,0,sizeof(fiu));
	}
};
Trie *T=new Trie;
void ins(Trie *nod, char *s){
	if(*s=='\n'){
		nod->cnt++; return;
	}
	if(nod->fiu[CH]==0){
		nod->fiu[CH]=new Trie;
		nod->nrfii++;
	}
	ins(nod->fiu[CH],s+1);
}
int del(Trie *nod, char *s){
	if(*s=='\n') nod->cnt--;
	else
		if(del(nod->fiu[CH],s+1)){
			nod->fiu[CH]=0;
			nod->nrfii--;
		}
	if(nod->cnt==0 && nod->nrfii==0 && nod!=T){
		delete nod; return 1;
	}
	return 0;
}
int que(Trie *nod, char *s){
	if(*s=='\n')
		return nod->cnt;
	if(nod->fiu[CH])
		return que(nod->fiu[CH],s+1);
	return 0;
}
int pre(Trie *nod, char *s, int k){
	if(*s=='\n'||nod->fiu[CH]==0)
		return k;
	return pre(nod->fiu[CH],s+1,k+1);
}
int main(){
	char line[32];
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	fgets(line,32,stdin);
	while(!feof(stdin)){
		switch(line[0]){
		case '0': ins(T,line+2); break;
		case '1': del(T,line+2); break;
		case '2': printf("%d\n",que(T,line+2)); break;
		case '3': printf("%d\n",pre(T,line+2,0)); break;
		}
		fgets(line,32,stdin);
	}
	return 0;
}