Cod sursa(job #828098)

Utilizator Robert29FMI Tilica Robert Robert29 Data 2 decembrie 2012 23:13:03
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<stdio.h>
#include<cstring>
using namespace std;
FILE*f=fopen("trie.in","r");
FILE*g=fopen("trie.out","w");
int sol;
char v[26];
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]&&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)
{
	++sol;
	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))
	{
		switch(v[0]-'0')
		{
			case 0: insert(p,v+2); break;
			case 1: erase(p,v+2); break;
			case 2:	
			{	
				sol=0;
				nrap(p,v+2);
				fprintf(g,"%d\n",sol);
				break;
			}
			case 3:
			{
				sol=-1;
				pref(p,v+2);
				fprintf(g,"%d\n",sol);
				break;
			}
		}
	}
	
	fclose(f);
	fclose(g);
	return 0;
}