Cod sursa(job #1491065)

Utilizator gyeresihunorGyeresi Hunor gyeresihunor Data 24 septembrie 2015 18:54:36
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include<stdio.h>
#include<stdlib.h>

typedef struct szoFa{
	szoFa* betuk[26];
	int darab;
	int resz;
}szoFa;

void insertSzo(szoFa* &pont, char* szo);
void deleteSzo(szoFa* &pont, char* szo);
int findCount(szoFa* pont, char* szo);
int findStart(szoFa* pont, char* szo, int melyseg);

int main() {
	//FILE * be = fopen("be.txt", "r");
	//freopen("ki.txt", "w", stdout);	
	FILE * be = fopen("trie.in", "r");
	freopen("trie.out", "w", stdout);
	szoFa* alap = (szoFa*)malloc(sizeof(szoFa));
	for (int i = 0; i < 26; ++i) {
		alap->betuk[i] = NULL;
	}
	alap->darab = 0;
	alap->resz = -1;
	int n;
	char c, szo[21];
	while (!feof(be)) {
		fscanf(be, "%d%c%s", &n,&c,szo);
		switch (n) {
		case 0:
			insertSzo(alap, szo);
			break;
		case 1:
			deleteSzo(alap, szo);
			break;
		case 2:
			printf("%d\n", findCount(alap, szo));
			break;
		case 3:
			printf("%d\n", findStart(alap, szo, 0));
			break;
		}
	}

	fcloseall();
	return 0;
}

void insertSzo(szoFa* &pont, char* szo) {
	if (pont->betuk[(szo[0] - 'a')] == NULL) {
		pont->betuk[szo[0] - 'a'] = (szoFa*)malloc(sizeof(szoFa));
		for (int i = 0; i < 26; ++i) {
			pont->betuk[szo[0] - 'a']->betuk[i] = NULL;
		}
		pont->betuk[szo[0] - 'a']->darab = 0;
		pont->betuk[szo[0] - 'a']->resz = 0;
	}
	pont->betuk[szo[0] - 'a']->resz++;
	if (szo[1] == '\0') {
		pont->betuk[szo[0] - 'a']->darab++;
		return;
	}
	else insertSzo(pont->betuk[szo[0] - 'a'], szo+1);
}

void deleteSzo(szoFa* &pont, char* szo) {
	if (szo[0] == '\0') return;
	pont->betuk[szo[0] - 'a']->resz--;
	if (szo[1] == '\0') {
		pont->betuk[szo[0] - 'a']->darab--;
		return;
	}
	deleteSzo(pont->betuk[szo[0] - 'a'], szo+1);
}

int findCount(szoFa* pont, char* szo) {
	if (szo[0] == '\0') return 0;
	if (szo[1] == '\0') {
		return pont->betuk[szo[0] - 'a']->darab;
	}
	if (pont->betuk[szo[0] - 'a'] == NULL) return 0;
	return  findCount(pont->betuk[szo[0] - 'a'], szo + 1);
}

int findStart(szoFa* pont, char* szo, int melyseg) {
	if (szo[0] == '\0') return 0;
	if (pont->betuk[szo[0] - 'a'] == NULL) return melyseg;
	if (pont->betuk[szo[0] - 'a']->resz == 0) return melyseg;
	return  findStart(pont->betuk[szo[0] - 'a'], szo + 1, melyseg + 1);
}