Cod sursa(job #415001)

Utilizator swift90Ionut Bogdanescu swift90 Data 10 martie 2010 20:12:14
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>
struct nod{
	int nrp,nrc;
	nod *fi[26];
	nod(){
		nrp=nrc=0;
		for(int i=0;i<26;++i)
			fi[i]=0;
	}
};
void add(nod *p,char *s){
	++p->nrp;
	if(*s==0){
		++p->nrc;
		return;
	}
	if(p->fi[*s-'a']==0)
		p->fi[*s-'a']=new nod();
	add(p->fi[*s-'a'],s+1);
}
nod *del(nod *p,char *s){
	--p->nrp;
	if(*s==0)
		--p->nrc;
	else
		p->fi[*s-'a']=del(p->fi[*s-'a'],s+1);
	if(p->nrp==0){
		delete p;
		p=0;
	}
	return p;
}
int apar(nod *p,char *s){
	if(*s==0)
		return p->nrc;
	if(p->fi[*s-'a']==0)
		return 0;
	return apar(p->fi[*s-'a'],s+1);
}
int prefix(nod *p,char *s){
	if(*s==0)
		return 0;
	if(p->fi[*s-'a']==0)
		return 0;
	return 1+prefix(p->fi[*s-'a'],s+1);
}
int main(){
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	int x;
	char s[32];
	nod *tr=0;
	while( scanf("%d %s\n",&x,s) != EOF){
		if(tr==0)
			tr=new nod;
		if(!x)
			add(tr,s);
		if(x==1)
			tr=del(tr,s);
		if(x==2)
			printf("%d\n",apar(tr,s));
		if(x==3)
			printf("%d\n",prefix(tr,s));
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}