Cod sursa(job #2725905)

Utilizator Rares31100Popa Rares Rares31100 Data 19 martie 2021 20:31:41
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>

using namespace std;

typedef struct Trie* trie; 
struct Trie
{
	int apar = 0, term = 0;
	trie adr[26];
};
trie Vf = new Trie();

void adauga(string cuv)
{
	trie poz = Vf;
	for(auto lit:cuv)
	{
		if(poz -> adr[lit - 'a'] == NULL)
		{
			trie newRam = new Trie();
			poz -> adr[lit - 'a'] = newRam;
		}
		
		poz = poz -> adr[lit - 'a'];
		poz -> apar++;
	}
	
	poz -> term++;
}

void sterge(string cuv)
{
	stack < pair <trie, char> > s;
	s.push({Vf, 'a'});
	trie poz = Vf;
	cuv.push_back('a');
	
	for(int i = 0; i < cuv.size() - 1; i++)
		if(poz -> adr[cuv[i] - 'a'] == NULL)
			return;
		else
		{
			poz = poz -> adr[cuv[i] - 'a'];
			s.push({poz, cuv[i]});
		}
		
	poz -> term--;
		
	bool do_it = true;
	while(s.size() > 1)
	{
		poz = s.top().first;
		char lit = s.top().second - 'a';
		s.pop();
		poz -> apar--;
		
		if(poz -> apar == 0 && do_it)
			s.top().first -> adr[lit] = NULL;
		else
			do_it = false;
	}
}

int aparitii(string cuv)
{
	trie poz = Vf;
	
	for(auto lit:cuv)
		if(poz -> adr[lit - 'a'] == NULL)
			return 0;
		else
			poz = poz -> adr[lit - 'a'];
			
	return poz -> term;
}

int prefix(string cuv)
{
	int lung = 0;
	trie poz = Vf;
	
	for(auto lit:cuv)
		if(poz -> adr[lit - 'a'] == NULL)
			return lung;
		else
		{
			lung++;
			poz = poz -> adr[lit - 'a'];
		}
	
	return lung;
}

ifstream fin("trie.in");
ofstream fout("trie.out");
int c;
string cuv;

int main()
{
	while(fin >> c)
	{
		fin >> cuv;
		
		switch(c)
		{
			case 0: adauga(cuv); break;
			case 1: sterge(cuv); break;
			case 2: fout << aparitii(cuv) << '\n'; break;
			case 3: fout << prefix(cuv) << '\n'; break;
		}
	}
	
	return 0;
}