Cod sursa(job #476953)

Utilizator robigiirimias robert robigi Data 12 august 2010 20:39:54
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
// Trie.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
#include "stdio.h"
#include "string.h"

FILE *f=fopen("trie.in", "r");
FILE *g=fopen("trie.out", "w");


struct Trie 
{  
	int cnt, nrfii;     
	Trie *fiu[ 26 ];    
	Trie() 
	{        
		cnt = nrfii = 0;       
		memset( fiu, 0, sizeof( fiu ) ); 
	} 
}; 


Trie *t=new Trie;


void insert(Trie *nod, char *c)
{
	if (*c=='\n')
	{
		nod ->cnt++;
		return ;
	}
	if (nod->fiu[*c-'a']==0)
	{
		nod->fiu[*c-'a']=new Trie;
		nod->nrfii++;
	}
	insert( nod->fiu[ *c-'a' ], c+1 ); 
}


int sterge(Trie *nod, char *c)
{
	if (*c=='\n')
		nod->cnt--;
	else
	{
		if (sterge(nod->fiu[*c-'a'], c+1))
		{
			nod->fiu[*c-'a']=0;
			nod->nrfii--;
		}
	}

	if (nod->cnt==0 && nod->nrfii==0 && nod!=t)
	{
		delete nod;
		return 1;
	}
	return 0;
}


int numar(Trie *nod, char *c)
{
	if (*c=='\n')
		return nod->cnt;
	if (nod->fiu[*c-'a'])
		return numar(nod->fiu[*c-'a'], c+1);
	return 0;
}

int prefix(Trie *nod, char *c, int k)
{
	if (*c=='\n' || nod->fiu[*c-'a']==0)
		return k;
	return prefix(nod->fiu[*c-'a'], c+1, k+1);
}




int main()
{
	char s[32];
	fgets(s, 32, f);

	while (!feof(f))
	{
		switch (s[0])
		{
		case '0': insert(t, s+2); break;
		case '1': sterge(t, s+2); break;
		case '2': fprintf(g, "%d\n", numar(t, s+2)); break;
		case '3': fprintf(g, "%d\n", prefix(t, s+2, 0)); break;
		}
		fgets(s, 32, f);
	}

	return 0;
}