Cod sursa(job #2636172)

Utilizator irimia_alexIrimia Alex irimia_alex Data 16 iulie 2020 21:31:48
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <stdio.h>
#include <stack>
#define NMAX 100005

FILE* fin, * fout;

struct nod {
	char c = 0;
	int aparitii = 0, sfarsit = 0;
	nod* urm[26] = { 0 };
}*rad;

void adauga(const char* s) {
	nod* n = rad;
	for (int i = 0;s[i] != '\0';++i) {
		char c = s[i] - 'a';
		if (n->urm[c] == NULL)
			n->urm[c] = new nod;
		nod* e = n->urm[c];
		e->c = c;
		++e->aparitii;
		n = e;
	}
	++n->sfarsit;
}

void sterge(const char* s) {
	std::stack<nod**> st;
	nod* n = rad;
	for (int i = 0;s[i] != '\0';++i) {
		char c = s[i] - 'a';
		st.push(&n->urm[c]);
		n = n->urm[c];
	}
	--n->sfarsit;
	while (!st.empty()) {
		nod** e = st.top();
		st.pop();
		--(*e)->aparitii;
		if ((*e)->aparitii == 0) {
			*e = NULL;
			delete* e;
		}
	}
}

int aparitii(const char* s) {
	nod* n = rad;
	for (int i = 0;s[i] != '\0';++i) {
		char c = s[i] - 'a';
		if (n->urm[c] == NULL)
			return 0;
		n = n->urm[c];
	}
	return n->sfarsit;
}

int prefix(const char* s) {
	nod* n = rad;
	int nr = 0;
	for (int i = 0;s[i] != '\0';++i) {
		char c = s[i] - 'a';
		if (n->urm[c] == NULL)
			return nr;
		++nr;
		n = n->urm[c];
	}

	return nr;
}

void afis(nod* n = rad) {
	if (n == NULL)
		return;
	printf("%c %i %i\n", n->c + 'a', n->aparitii, n->sfarsit);
	for (int i = 0;i < 26;++i)
		afis(n->urm[i]);
}

int main() {
	fin = fopen("trie.in", "r");
	fout = fopen("trie.out", "w");

	rad = new nod;

	int t;
	char s[21];

	while (fscanf(fin, "%i %s", &t, s) > 0) {
		if (t == 0) {
			adauga(s);
		}
		else if (t == 1) {
			sterge(s);
		}
		else if (t == 2) {
			fprintf(fout, "%i\n", aparitii(s));
		}
		else {
			fprintf(fout, "%i\n", prefix(s));
		}
		/*printf("AFIS: %i %s\n", t, s);
		afis();*/
	}


	return 0;
}