Cod sursa(job #877503)

Utilizator dragosnicolaeNicolae Dragos dragosnicolae Data 12 februarie 2013 21:53:39
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<stdio.h>
#include<string.h>
struct trie{
	trie *f[26];
	int nr,nrf;
	trie(){
		nr=nrf=0;
		memset(f,0,sizeof(f));
	}
};
trie *r;
int n,m,k;
char x[30];

void adaug(){
	trie *q;
	q=r;
	for(int i=0;i<m;i++){
		if(q->f[x[i]-'a']==0){
			q->nrf++;
			q->f[x[i]-'a']=new trie();
		}
		q=q->f[x[i]-'a'];
	}
	q->nr++;
}
int numar(){
	trie *q;
	q=r;
	for(int i=0;i<m;i++)
		if(q->f[x[i]-'a']==0)
			return 0;
		else
			q=q->f[x[i]-'a'];
	return q->nr;
}
int prefix(){
	trie *q;
	q=r;
	for(int i=0;i<m;i++){
		if(q->f[x[i]-'a']==0)
			return i;
		q=q->f[x[i]-'a'];
	}
	return m;
}
void sterg(trie *q,int i){
	if(i==m)
		q->nr--;
	else{
		sterg(q->f[x[i]-'a'],i+1);
		if(q->f[x[i]-'a']->nr==0&&q->f[x[i]-'a']->nrf==0){
			delete q->f[x[i]-'a'];
			q->f[x[i]-'a']=0;
			q->nrf--;
		}
	}
}
	
	
int main(){
	FILE *f,*g;
	r=new trie();
	f=fopen("trie.in","r");
	g=fopen("trie.out","w");
	while(!feof(f)){
		fscanf(f,"%d %s",&k,x);
		if(feof(f))
			break;
		m=strlen(x);
		if(k==0)
			adaug();
		if(k==1)
			sterg(r,0);
		if(k==2)
			fprintf(g,"%d\n",numar());
		if(k==3)
			fprintf(g,"%d\n",prefix());
	}
	
	fclose(f);
	fclose(g);
	return 0;
	
}