Cod sursa(job #978647)

Utilizator Kira96Denis Mita Kira96 Data 29 iulie 2013 13:42:19
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
#include<cstring>
#define DIM 2500000
#define DM 30
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int i,t,T,n,tip,L;
char s[DIM];
char c[DM];
struct Trie
{
	int nr,nrfii;
	Trie *fiu[30];
	Trie()
	{
		nrfii=nr=0;
		memset(fiu,0,sizeof(fiu));
	}
};
Trie *r=new Trie;
void insert(Trie *nod,char *p)
{
	if(!(*p)){
		++nod->nr;
		return ; }
	if(nod->fiu[*p]==NULL)
	{
		nod->fiu[*p]=new Trie;
		++nod->nrfii;
	}
	insert(nod->fiu[*p],p+1);
}
int erase(Trie *nod,char *p)
{
	if(!(*p)){
		--nod->nr; }
	else
	if(nod->fiu[*p]){
		if(erase(nod->fiu[*p],p+1)){
			nod->fiu[*p]=NULL;
			--nod->nrfii; }
	}
	if(!nod->nrfii&&!nod->nr&&nod!=r){
		delete nod;
		return 1;
	}
	return 0;
}
int find(Trie *nod,char *p)
{
	if(!(*p))
		return nod->nr;
	if(nod->fiu[*p])
		return find(nod->fiu[*p],p+1);
	return 0;
}
int prefix(Trie *nod,char *p)
{
	++L;
	if(nod->fiu[*p])
		return prefix(nod->fiu[*p],p+1);
	return L-1;
}
int main ()
{
	f.get(s,DIM,EOF);
	n=strlen(s);
	for(i=0;i<n;++i)
	{
		tip=s[i]-'0';
		i+=2;
		t=-1;
		while(s[i]!='\n'&&i<n)
			c[++t]=s[i++]-'a'+1;
		L=0;
		c[++t]=0;
		if(tip==0)
			insert(r,c);
		if(tip==1)
			t=erase(r,c);
		if(tip==2)
			g<<find(r,c)<<"\n";
		if(tip==3)
			g<<prefix(r,c)<<"\n";
	}
	return 0;
}