Cod sursa(job #933096)

Utilizator raulstoinStoin Raul raulstoin Data 29 martie 2013 16:48:34
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
#include<cstring>
#define Z cuv[i]-'a'
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TRIE
{
	int nr_apar,nr_fii;
	TRIE *fii[26];
	TRIE()
	{
		nr_apar=nr_fii=0;
		for(short i=0;i<26;i++) fii[i]=0;
	}
}*G;
char cuv[25];
bool sw;
inline void add()
{
	short i=0;
	TRIE *p=G;
	for(;cuv[i] && p->fii[Z];p=p->fii[Z],i++);
	if(!cuv[i])
	{
		p->nr_apar++;
		return;
	}
	while(cuv[i])
	{
		p->nr_fii++;
		p=p->fii[Z]=new TRIE;
		i++;
	}
	p->nr_apar++;
}
inline void print_cuv()
{
	short i=0;
	TRIE *p=G;
	for(;cuv[i] && p->fii[Z];p=p->fii[Z],i++);
	if(!cuv[i])
		fout<<p->nr_apar<<'\n';
	else
		fout<<0<<'\n';
}
inline void print_pref()
{
	short i=0;
	TRIE *p=G;
	for(;cuv[i] && p->fii[Z];p=p->fii[Z],i++);
	fout<<i<<'\n';
}
inline void del(int i,TRIE *p)
{
	if(cuv[i])
		del(i+1,p->fii[(int)cuv[i]-'a']);
	else
		p->nr_apar--;
	if(sw)
	{
		p->nr_fii--;
		p->fii[Z]=0;
		sw=0;
	}
	if(!p->nr_apar && !p->nr_fii)
	{
		delete p;
		sw=1;
	}
}
int main()
{
	int choice;
	G=new TRIE;
	G->nr_apar=1;
	while(fin>>choice>>cuv)
	{
		if(choice==0)
			add();
		if(choice==1)
			del(0,G);
		if(choice==2)
			print_cuv();
		if(choice==3)
			print_pref();
	}
	fin.close();
	fout.close();
	return 0;
}