Cod sursa(job #2051059)

Utilizator cipri321Marin Ciprian cipri321 Data 28 octombrie 2017 14:54:37
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
using namespace std;
struct TRIE
{
	int nrc,nre;
	TRIE *E[30];
	TRIE()
	{
		nrc=nre=0;
		for(int i=0;i<26;i++)
			E[i]=0;
	}
};
ifstream fi("trie.in");
ofstream fo("trie.out");
int tip;
char command[30];
TRIE *T=new TRIE;
void adauga(TRIE *nod,char C[])
{
	if(!C[0])
	{
		nod->nrc++;
		return;
	}
	int x=C[0]-'a';
	if(nod->E[x]==0)
	{
		nod->nre++;
		nod->E[x]=new TRIE;
	}
	adauga(nod->E[x],C+1);
}
int sterge(TRIE *nod,char C[])
{
	if(!C[0])
		nod->nrc--;
	else if(sterge(nod->E[C[0]-'a'],C+1))
	{
		nod->E[C[0]-'a']=0;
		nod->nre--;
	}
	if(nod->nrc==0&&nod->nre==0&&nod!=T)
	{
		delete nod;
		return 1;
	}
	return 0;
}
int nraparitii(TRIE *nod,char C[])
{
	if(!C[0])
		return nod->nrc;
	int x=C[0]-'a';
	if(nod->E[x])
		return nraparitii(nod->E[x],C+1);
	else
		return 0;
}
int nrprefixe(TRIE *nod,char C[],int k)
{
	if(!C[0])
		return k;
	if(!nod->E[C[0]-'a'])
		return k;
	return nrprefixe(nod->E[C[0]-'a'],C+1,k+1);
}
int main()
{
	while(fi>>tip)
	{
		fi>>command;
		if(tip==0)
			adauga(T,command);
		else if(tip==1)
			sterge(T,command);
		else if(tip==2)
			fo<<nraparitii(T,command)<<"\n";
		else
			fo<<nrprefixe(T,command,0)<<"\n";
	}
	fi.close();
	fo.close();
}