Mai intai trebuie sa te autentifici.

Cod sursa(job #1491040)

Utilizator gyeresihunorGyeresi Hunor gyeresihunor Data 24 septembrie 2015 18:14:20
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
//infoarena.ro - trie
#include<stdio.h>
#include<stdlib.h>

#pragma warning(disable:4996)

typedef struct alma
{
	alma* kov[26];
	char darab[26];
	char resze[26];
}ALMA;

alma* iinsert(alma* gy, char* w);
alma* rremove(alma* gy, char* w);
int qquery(alma* gy, char* w);
void prefix(alma* gy, char* w);
alma* gyoker=NULL;

int drb;

int main()
{
	FILE* f=freopen("trie.in","r",stdin);
	freopen("trie.out", "w", stdout);
	int w;
	char c;
	char str[30];
	int db;	
	while (!feof(f))
	{
		fscanf(f,"%d%c%s", &w, &c, str);
		switch (w)
		{
		case 0: gyoker=iinsert(gyoker, str); break;
		case 1: gyoker=rremove(gyoker, str); break;
		case 2: db = qquery(gyoker, str); printf("%d\n", db); break;
		case 3: drb = 0; prefix(gyoker, str); printf("%d\n", drb); break;
		default:
			break;
		}
	}
	fcloseall();
	return 0;
}

alma* iinsert(alma* gy, char* w)
{
	if (gy == NULL)
	{
		gy = (alma*)malloc(sizeof(alma));
		for (int i = 0; i < 26; ++i){ gy->kov[i] = NULL; gy->darab[i] = 0; gy->resze[i] = 0; }
	}
	int tag = *w - 'a';
	if (w[1] == '\0')
	{
		gy->darab[tag]++;
		gy->resze[tag]++;
		return gy;
	}
	else
	{
		gy->kov[tag] = iinsert(gy->kov[tag], w + 1);
		gy->resze[tag]++;
	}
	return gy;
}

alma* rremove(alma* gy, char* w)
{
	int tag = *w - 'a';
	if (w[1] == '\0')
	{
		gy->darab[tag]--;
		gy->resze[tag]--;
	}
	else
	{
		gy->kov[tag] = rremove(gy->kov[tag], w + 1);
		gy->resze[tag]--;
	}
	return gy;
}

int qquery(alma* gy, char* w)
{
	if (gy == NULL)return 0;
	if (w[0] == '\0')return 0;
	int tag = *w - 'a';
	if (w[1] == '\0')
	{
		return gy->darab[tag];
	}
	return qquery(gy->kov[tag],w+1);
}

void prefix(alma* gy, char* w)
{
	if (gy == NULL)return;
	if (w[0] == '\0')return;
	int tag = *w - 'a';
	if (gy->resze[tag] > 0)drb++;
	prefix(gy->kov[tag], w + 1);
}