Cod sursa(job #1750629)

Utilizator delia_ioanaCeapa Delia Ioana delia_ioana Data 30 august 2016 16:49:44
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <cstring>

struct Trie {
	int cnt, nrfii;
	Trie *fiu[26];
 
	Trie() {
		cnt = nrfii = 0;
		memset(fiu, 0, sizeof(fiu));     //wtf is dis?
    }
};
 
Trie *T = new Trie;

void ins(Trie *nod, char *s) {
	if (*s == '\n') {
		nod->cnt ++;
		return;
	}
	
	if (nod->fiu[*s - 'a'] == 0) {
		nod->fiu[*s - 'a'] = new Trie;
		nod->nrfii ++;
	}

	ins(nod->fiu[*s - 'a'], s + 1);
}

int del(Trie *nod, char *s) {
	if (*s == '\n')
		nod->cnt --;
	else if (del(nod->fiu[*s - 'a'], s + 1)) {
		nod->fiu[*s - 'a'] = 0;              //de ce 0? nu e int
		nod->nrfii --;
	}

	if (nod->cnt == 0 && nod->nrfii == 0 && nod != T) {
		delete nod;
		return 1;
	}
	return 0;
}

int count(Trie *nod, char *s) {
	if (*s == '\n') 
		return nod->cnt;

	if (nod->fiu[*s - 'a'])
		return count(nod->fiu[*s - 'a'], s + 1);
	return 0;
}

int longest(Trie *nod, char *s) {
	if (*s == '\n' || !nod->fiu[*s - 'a'])
		return 0;
	else return (1 + longest(nod->fiu[*s - 'a'], s + 1));
}

int main() {
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	char line[32];
	
	do {
		fgets(line, 32, stdin);
		if (line[0] == '0')
			ins(T, line + 2);
		else if (line[0] == '1')
			del(T, line + 2);
		else if (line[0] == '2')
			printf("%d\n", count(T, line + 2));
		else printf("%d\n", longest(T, line + 2));
	} while (!feof(stdin));
	return 0;
}