Cod sursa(job #833731)

Utilizator raulstoinStoin Raul raulstoin Data 12 decembrie 2012 22:58:49
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
#include<string.h>
#define set0 for(int i=0;i<26;i++) fii[i]=0;
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct TRIE
{
	int nr_apar,nr_fii;
	TRIE *fii[26];
	TRIE()
	{
		nr_apar=nr_fii=0;
		set0;
	}
}*G;
char cuv[30];
int sw;
void add()
{
	int i=0;
	TRIE *p=G;
	while(cuv[i] && p->fii[(int)cuv[i]-'a'])
		p=p->fii[(int)cuv[i++]-'a'];
	if(!cuv[i])
	{
		p->nr_apar++;
		return;
	}
	while(cuv[i])
	{
		p->nr_fii++;
		p->fii[(int)cuv[i]-'a']=new TRIE;
		p=p->fii[(int)cuv[i]-'a'];
		i++;
	}
	p->nr_apar++;
}
void print_cuv()
{
	int i=0;
	TRIE *p=G;
	while(cuv[i] && p->fii[(int)cuv[i]-'a'])
		p=p->fii[(int)cuv[i++]-'a'];
	if(!cuv[i])
		g<<p->nr_apar<<'\n';
	else
		g<<0<<'\n';
}
void printf_pref()
{
	int i=0;
	TRIE *p=G;
	while(cuv[i] && p->fii[(int)cuv[i]-'a'])
		p=p->fii[(int)cuv[i++]-'a'];
	g<<i<<'\n';
}
void del(int i,TRIE *p)
{
	if(cuv[i])
		del(i+1,p->fii[(int)cuv[i]-'a']);
	else
		p->nr_apar--;
	if(sw==1)
	{
		p->nr_fii--;
		p->fii[(int)cuv[i]-'a']=0;
		sw=0;
	}
	if(!p->nr_apar && !p->nr_fii && p!=G)
	{
		delete p;
		sw=1;
	}
	
}
int main()
{
	int choice;
	G=new TRIE;
	while(f>>choice>>cuv)
	{
		switch(choice)
		{
			case 0:
				{
					add();
					break;
				}
			case 1:
				{
					del(0,G);
					break;
				}
			case 2:
				{
					print_cuv();
					break;
				}
			case 3:
				{
					printf_pref();
					break;
				}
		}
	}
	f.close();
	g.close();
	return 0;
}