Cod sursa(job #326342)

Utilizator katakunaCazacu Alexandru katakuna Data 24 iunie 2009 18:04:11
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
using namespace std;
#include <cstdio>
#include <string>

struct trie {

	int nrcuv, nrfii;
	trie *fiu[26];
	
	trie() {
		nrcuv = nrfii = 0;
		memset(fiu, 0, sizeof(fiu));
	}
	
};

int tip, n;
char cuv[32];

void insert( trie *nod, int i ){

	if( i > n ){ nod->nrcuv++; return ;}
	
	if( nod->fiu[ cuv[i] - 'a' ] == 0 ){
		nod->fiu[ cuv[i] - 'a' ] = new trie;
		nod->nrfii++;
	}
	
	insert( nod->fiu[ cuv[i] - 'a' ], i + 1 );
}


int del( trie *nod, int i ){
	
	if( i > n ) { 
		nod->nrcuv--;  
		if( nod->nrcuv == 0 && nod->nrfii == 0){delete nod ; return 1;}
		return 0;
	}
	
	if( del( nod->fiu[ cuv[i] - 'a' ], i + 1 ) ){
		nod->fiu[ cuv[i] - 'a' ] = 0;
		nod->nrfii--;
	}
	
	if( nod->nrcuv == 0 && nod->nrfii == 0){delete nod ; return 1;}
	
	return 0;
}

int query( trie *nod, int i ){

	if( i > n ){ return nod->nrcuv;}
	
	if( nod->fiu[ cuv[i] - 'a' ] ) return query(nod->fiu[ cuv[i] - 'a' ], i + 1);
	return 0;
}

int prefix( trie *nod, int i, int lg ){
	
	if( i > n || nod->fiu[ cuv[i] - 'a' ] == 0) return lg;
	return prefix( nod->fiu[ cuv[i] - 'a' ], i + 1, lg + 1 );
}

int main(){

	FILE *f = fopen("trie.in", "r");
	FILE *g = fopen("trie.out", "w");
	
	trie *R = new trie;
	fscanf(f,"%d %s", &tip, cuv);
	while( !feof(f) ){
		n = strlen(cuv) - 1;
		if( R == 0 ) R = new trie;
		
		switch (tip){
			case 0 : insert(R, 0); break;
			case 1 : del(R, 0); break;
			case 2 : fprintf(g,"%d\n", query(R, 0)); break;
			case 3 : fprintf(g,"%d\n", prefix(R, 0, 0)); break;
		}
		
		fscanf(f,"%d %s", &tip, cuv);
	}
	
	fclose(f);
	fclose(g);
	
	return 0;

}