Cod sursa(job #714827)

Utilizator Robert29FMI Tilica Robert Robert29 Data 16 martie 2012 11:13:22
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<stdio.h>
#include<cstring>
using namespace std;
FILE*f=fopen("trie.in","r");
FILE*g=fopen("trie.out","w");
int sol,l;
char v[25];
struct trie
{
	int nr,nrfii;
	trie *son[27];
	trie()
	{
		nr=nrfii=0;
		memset(son,0,sizeof(son));
	}
} *p=new trie;
void insert(trie *nod,char *q)
{
	if(*q=='\n')
	{
		++nod->nr;
		return ;
	}
	if(nod->son[*q-'a'+1]==NULL)
	{
		nod->son[*q-'a'+1]=new trie;
		++nod->nrfii;
	}
	insert(nod->son[*q-'a'+1],q+1);
}
int erase(trie *nod,char *q)
{
	if(*q=='\n')
		--nod->nr;
	else if(nod->son[*q-'a'+1])
		if(erase(nod->son[*q-'a'+1],q+1))
		{
			--nod->nrfii;
			nod->son[*q-'a'+1]=NULL;
		}
	if(nod->nr==0&&nod->nrfii==0&&nod!=p)
	{
		delete nod;
		return 1;
	}
	
	return 0;
}
void nrap(trie *nod,char *q)
{
	if(*q=='\n')
	{
		sol=nod->nr;
		return ;
	}
	if(nod->son[*q-'a'+1])
		nrap(nod->son[*q-'a'+1],q+1);
}
void pref(trie *nod,char *q)
{
	++l;
	if(*q=='\n')
		return ;
	if(nod->son[*q-'a'+1]!=NULL)
		pref(nod->son[*q-'a'+1],q+1);
}
int main()
{
	
	while(fgets(v,25,f))
	{
		if(v[0]=='0')
			insert(p,v+2);
		else if(v[0]=='1')
			erase(p,v+2);
		else if(v[0]=='2')
		{
			sol=0;
			nrap(p,v+2);
			fprintf(g,"%d\n",sol);
		}
		else
		{
			l=-1;
			pref(p,v+2);
			fprintf(g,"%d\n",l);
		}
	}

	fclose(f);
	fclose(g);
	return 0;
}