Cod sursa(job #948898)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 11 mai 2013 21:07:41
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<fstream>
#include<cstring>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

const int MAXN=25;
const int MAX_ALPHA=27;

struct trie_node
{
	int prefix_count;
	int word_count;
	trie_node* children[MAX_ALPHA];
};
trie_node *head,*aux;

char word[MAXN];
int lg,i,j,opt,lprefix,gol;

int main()
{
	head=new trie_node();
	while (!fin.eof())
	{
		fin>>opt>>word;
		lg=strlen(word);
		if (!lg)
			break;
		switch (opt)
		{
		case 0:							//insert
			aux=head;
			for (i=0;i<lg;++i)
			{
				if (aux->children[word[i]-'a']==NULL)
				{
					aux->children[word[i]-'a']=new trie_node();
				}
				++(aux->prefix_count);
				aux=aux->children[word[i]-'a'];
			}
			++(aux->prefix_count);
			++(aux->word_count);
			break;
		case 1:							//delete
			aux=head;
			for (i=0;i<lg;++i)
			{
				--(aux->prefix_count);
				aux=aux->children[word[i]-'a'];
			}
			--(aux->prefix_count);
			--(aux->word_count);
			break;
		case 2:							//print
			gol=0;
			aux=head;
			for (i=0;i<lg;++i)
			{
				if (aux->children[word[i]-'a']==NULL)
				{
					gol=1;
					break;
				}
				aux=aux->children[word[i]-'a'];
			}
			if (gol)
				fout<<0<<'\n';
			else
				fout<<aux->word_count<<'\n';
			break;
		case 3:
			lprefix=0;
			aux=head;
			for (i=0;i<lg;++i)
			{
				if (aux->children[word[i]-'a']!=NULL)
				{
					aux=aux->children[word[i]-'a'];
					if (aux->prefix_count!=0)
					{
						++lprefix;
					}
				}
				else
					break;
			}
			fout<<lprefix<<'\n';
			break;
		}
	}
	fin.close();
	fout.close();
	return 0;
}