Cod sursa(job #315050)

Utilizator mihneadbDobrescu-Balaur Mihnea mihneadb Data 14 mai 2009 10:14:14
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>

class arb{
private:
	arb(){
		nrc=nrp=0;
		for(int i=0;i<26;i++)
			fiu[i]=0;
	}
public:
	int nrc;
	int nrp;
	arb *fiu[26];
	void add(arb *p, char *s);
	arb *rm(arb *p, char *s);
	int apar(arb *p, char *s);
	int prefix(arb *p, char *s);
};

arb::void add(arb *p, char *s){
	p->nrp++;
	if (!*s){
		p->nrc++;
		return;
	}
	int ascii;
	ascii=*s-'a';
	if(!p->fiu[ascii])
		p->fiu[ascii]=new arb;
	arb::add(p->fiu[ascii],s+1);
}

arb::arb* rm(arb *p, char *s){
	p->nrp--;
	if(!*s){
		p->nrc--;
		return;
	}
	else
		p->fiu[*s-'a']=arb::rm(p->fiu[*s-'a'],s+1);
	if(!p->nrp){
		delete p;
		p=0;
	}
	return p;
}

arb::int apar(arb *p, char *s){
	if (!*s){
		return p->nrc;
	}
	if (!p->fiu[*s-'a'])
		return 0;
	return arb::apar(p->fiu[*s-'a'],s+1);
}

arb::int prefix(arb *p, char *s){
	if (!*s)
		return 0;
	if (!p->fiu[*s-'a'])
		return 0;
	return 1 + arb::prefix ( p->fiu[*s-'a'], s+1 );
}

int main(){
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	int x;
	char s[100];
	arb *trie=0;
	while (scanf("%d %s\n",&x,&s)!=EOF){
		if(trie==0)
			trie=new arb;
		if(x==0)
			arb::add(trie,s);
		if(x==1)
			arb::rm(trie,s);
		if(x==2)
			printf("%d\n",arb::apar(trie,s));
		if(x==3)
			printf("%d\n",arb::prefix(trie,s));
	}
	return 0;
}