Cod sursa(job #3317044)

Utilizator Cezar2009Cezar Mihai Titihazan Cezar2009 Data 21 octombrie 2025 19:54:03
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
//https://infoarena.ro/problema/trie

//#pragma GCC optimize ("Ofast")
//#pragma GCC optimize ("fast-math")
//#pragma GCC optimize ("unroll-loops")
//#define _USE_MATH_DEFINES

#include <iostream>
#include <fstream>
//#include <vector>
//#include <cstring>
//#include <cmath>
//#include <bitset>
//#include <queue>
//#include <stack>
//#include <utility>
//#include <algorithm>
//#include <string>
//#include <map>
//#include <unordered_map>
//#include <set>
//#include <unordered_set>
//#include <cstdint>
//#include <climits>
//#include <iomanip>
//#include <cstdio>
//#include <tuple>

using namespace std;

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

const int CHMAX = 26;

struct Nod
{
	int nrc; // Numarul de cuvinte care se termina pe nodul acesta
	int nrcd; // Numarul de cuvinte care sunt sub nodul acesta

	Nod* ch[CHMAX];

	Nod() : nrc(0), nrcd(0), ch{} {};
};

void insert(Nod* nod, char* c)
{
	nod->nrcd += 1;

	if (*c == '\0')
	{
		nod->nrc += 1;
	}
	else
	{
		int nr = *c - 'a';

		if (!nod->ch[nr])
			nod->ch[nr] = new Nod();

		insert(nod->ch[nr], c + 1);
	}
}

void erase(Nod* nod, char* c)
{
	nod->nrcd -= 1;

	if (*c == '\0')
	{
		nod->nrc -= 1;
	}
	else
	{
		int nr = *c - 'a';

		erase(nod->ch[nr], c + 1);

		if (nod->ch[nr]->nrcd == 0)
		{
			nod->ch[nr] = nullptr;
			delete nod->ch[nr];
		}
			
	}
}

int rez1(Nod* nod, char* c) 
{
	if (*c == '\0')
		return nod->nrc;

	int nr = *c - 'a';
	if (!nod->ch[nr])
		return 0;

	return rez1(nod->ch[nr], c + 1);
}

int rez2(Nod* nod, char* c)
{
	if (*c == '\0')
		return 0;

	int nr = *c - 'a';
	if (!nod->ch[nr])
		return 0;

	return rez2(nod->ch[nr], c + 1) + 1;
}


int main()
{
	//ios_base::sync_with_stdio(false);
	//cin.tie(NULL);

	Nod* rad = new Nod();
	char str[CHMAX];
	int c;

	while (fin >> c >> str)
	{
		if (c == 0)
		{
			insert(rad, str);
		}
		else if (c == 1)
		{
			erase(rad, str);
		}
		else if (c == 2)
		{
			fout << rez1(rad, str) << "\n";
		}
		else
		{
			fout << rez2(rad, str) << "\n";
		}
	}

	return 0;
}