Cod sursa(job #590349)

Utilizator AnteusPatrascoiu Mihai Anteus Data 16 mai 2011 22:35:03
Problema Trie Scor 100
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--;
	else
		p->fii+=del (p->v[s[i]-97], i+1);
	
	if (p->nr ==0 && p->fii==0 && p!=rad)
	{
		delete p;	p=NULL;
		return -1;
	}
	return 0;
}

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

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)		del (rad, 0);
	if (sw==2)		number (rad, 0);
	if (sw==3)		prefix (rad, 0);
}

return 0;
}