Cod sursa(job #2192498)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 6 aprilie 2018 12:13:03
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
const int NMAX = 2e6 + 3;
struct
{
	int pre, cuv;
	int son[33];
}t[NMAX];
int nr;
void Adauga(char cuvant[])
{
	int nod = 0;
	for(int i = 0; i < strlen(cuvant); i++)
	{
		int urm = t[nod].son[cuvant[i] - 'a'];
		if(!urm)
		{
			urm = ++nr;
			t[nod].son[cuvant[i] - 'a'] = urm;
		}
		t[urm].pre++;
		nod = urm;
	}
	t[nod].cuv++;
}

void Sterge(char cuvant[])
{
	int nod = 0;
	for(int i = 0; i < strlen(cuvant); i++)
	{
		int urm = t[nod].son[cuvant[i] - 'a'];
		t[urm].pre--;
		nod = urm;
	}
	--t[nod].cuv;
}

void NAparitii(char cuvant[])
{
	int nod = 0;
	int urm;
	for(int i = 0; i < strlen(cuvant); i++)
	{
		urm = t[nod].son[cuvant[i] - 'a'];
		if(!t[urm].pre)
		{
			g << "0\n";
			return;
		}
		nod = urm;
	}
	g << t[urm].cuv << "\n";
}

void Prefix(char cuvant[])
{
	int nod = 0;
	for(int i = 0; i < strlen(cuvant); i++)
	{
		int urm = t[nod].son[cuvant[i] - 'a'];
		if(!t[urm].pre)
		{
			g << i << "\n";
			return;
		}
		nod = urm;
	}
	g << strlen(cuvant) << "\n";
}

void Citire()
{
	int cerinta;
	char cuvant[1000];
	while(f >> cerinta >> cuvant)
	{
		if(cerinta == 0)
			Adauga(cuvant);
		else
			if(cerinta == 1)
				Sterge(cuvant);
			else
				if(cerinta == 2)
					NAparitii(cuvant);
				else
					Prefix(cuvant);
	}
}	

int main()
{
	Citire();

}