Cod sursa(job #233019)

Utilizator andrei.12Andrei Parvu andrei.12 Data 16 decembrie 2008 19:05:02
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<stdio.h>
#include<string.h>

int op, k;
char sir[30];

struct TT{
	int nr, fii;
	TT *fiu[30];

	TT(){
		nr = fii = 0;
		memset(fiu, 0, sizeof(fiu));
	}
};

TT *A = new TT;

void adg(TT *q, int ind){
	if (ind == k + 1){
		q -> nr ++;
		return ;
	}

	int i = sir[ind] - 'a';
	if (q -> fiu[i] == 0){
		q -> fiu[i] = new TT;
		q -> fii ++;
	}
	adg(q -> fiu[i], ind + 1);
}
int str(TT *q, int ind){
	if (ind == k + 1)
		q -> nr --;
	else
		if (str(q -> fiu[sir[ind] - 'a'], ind + 1) == 1){
			q -> fiu[sir[ind] - 'a'] = 0;
			q -> fii --;
		}

	if (q -> nr == 0 && q -> fii == 0 && q != A){
		delete q;
		return 1;
	}
	return 0;
}
int find(TT *q, int ind){
	if (ind == k + 1)
		return q -> nr;
	if (q -> fiu[sir[ind] - 'a'] != 0)
		return find(q -> fiu[sir[ind] - 'a'], ind + 1);
	return 0;
}
int prefix(TT *q, int ind, int nivel){
	if (ind == k+1 || q -> fiu[sir[ind] - 'a'] == 0)
		return nivel;
	return prefix(q -> fiu[sir[ind] - 'a'], ind+1, nivel + 1);
}

int main()
{
	freopen("trie.in", "rt", stdin);
	freopen("trie.out", "wt", stdout);


	while (scanf("%d %s", &op, sir+1) != EOF){
		k = strlen(sir+1);

		if (op == 0)
			adg(A, 1);
		if (op == 1)
			str(A, 1);
		if (op == 2)
			printf("%d\n", find(A, 1));
		if (op == 3)
			printf("%d\n", prefix(A, 1, 0));
	}

	return 0;
}