Cod sursa(job #2693713)

Utilizator IRadu1529Radu Ionescu IRadu1529 Data 6 ianuarie 2021 20:13:55
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <vector>
#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

char t[100];  int n, rez;

struct Trie {
	Trie* fii[28];
	int nrp;
	int nrc;
	Trie() {
		for (int i = 0; i <= 27; ++i)
			fii[i] = nullptr;
		nrp = nrc = 0;
	}
};
Trie* rad = new Trie();



void add(Trie*& aux, int i) {
	if (i == n) {
		aux->nrc++;
		aux->nrp++;
		return;
	}

	if (i != n) {
		if (aux->fii[t[i] - 'a'] == nullptr)
			aux->fii[t[i] - 'a'] = new Trie();
		if (i)
			aux->nrp++;

		add(aux->fii[t[i] - 'a'], i + 1);
	}
}

void erase(Trie*& aux, int i) {
	if (i == n) {
		aux->nrc = max(0, aux->nrc - 1);
		aux->nrp = max(0, aux->nrp - 1);
		return;
	}

	if (aux->fii[t[i] - 'a'] != nullptr) {
		if (i)
			aux->nrp = max(0, aux->nrp - 1);
		erase(aux->fii[t[i] - 'a'], i + 1);
		if (aux->fii[t[i] - 'a']->nrp == 0)
			aux->fii[t[i] - 'a'] = nullptr;
	}
}

void query1(Trie*& aux, int i) {
	if (i == n) {
		rez = aux->nrc;
		return;
	}
	if (aux->fii[t[i] - 'a'] != nullptr)
		query1(aux->fii[t[i] - 'a'], i + 1);
}

void query2(Trie*& aux, int i) {
	if (aux->fii[t[i] - 'a'] == nullptr) {
		rez = i;
		return;
	}

	query2(aux->fii[t[i] - 'a'], i + 1);
}

int main() {
	int N;

	while (fin >> N) {
		fin >> t;
		n = strlen(t);
		rez = 0;
		Trie* aux = rad;
		if (N == 0) {
			add(aux, 0);
			continue;
		}

		if (N == 1) {
			erase(aux, 0);
			continue;
		}

		if (N == 2) {
			query1(aux, 0);
			fout << rez << "\n";
		}

		else {
			query2(aux, 0);
			fout << rez << "\n";
		}
	}

	return 0;
}