Cod sursa(job #590339)

Utilizator AnteusPatrascoiu Mihai Anteus Data 16 mai 2011 21:40:38
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
#include <fstream.h>
#include <string.h>
ifstream fin("trie.in");
FILE *g=fopen ("trie.out", "w");
struct trie { int nr,fii;
			  trie *v[30];	}	*rad,*p;
int sw,n;
char s[25];

void setare (trie *&p)
{
	for (int i=0;i<=25;i++)
		p->v[i]=NULL;
	p->nr=0;	p->fii=0;
}

void update (trie *&p, int i) {
	if (i==n)
	{
		p->nr++;
		return;
	}
	
	if (!p->v[s[i]-97])
	{
		p->v[s[i]-97]=new trie;
		setare(p->v[s[i]-97]);
		p->fii++;
	}
	update (p->v[s[i]-97], i+1);
}

int del (trie *&p, int i) 
{
	if (i==n)
	{
		p->nr--;
		if (p->nr ==0 && p->fii==0 && p!=rad)
		{
			delete p;	p=NULL;
			return -1;
		}
		return 0;
	}
	
	p->fii+=del (p->v[s[i]-97], i+1);
	
	return 0;
}

void number (trie *p, int i) 
{
	if (!p)		
		{	fprintf (g, "0\n");		return;		}
	if (i<n)	number (p->v[s[i]-97], i+1);
	else		fprintf (g, "%d\n", p->nr);
}

void prefix (trie *p, int i)
{
	if (i==n || !p->v[s[i]-97])
		{	fprintf (g, "%d\n", i);		return;		}
	prefix (p->v[s[i]-97], i+1);
}


int main() {
rad=new trie;
setare(rad);
	
while (fin>>sw)
{
	fin>>s;		n=strlen(s);
	
	if (sw==0)		update (rad, 0);
	if (sw==1)		int x=del (rad, 0);
	if (sw==2)		number (rad, 0);
	if (sw==3)		prefix (rad, 0);
}

return 0;
}