Cod sursa(job #1369392)

Utilizator LycrsTrifan Tamara Lycrs Data 3 martie 2015 00:26:17
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");

struct Nod{
	int na, ns;
	Nod *fii[27];
	
	Nod()
	{
		na=ns=0;
		memset(fii, 0, sizeof(fii));
	}
};
 
Nod *R=new Nod;
int o;
char t[25];

void Add(char *u, Nod *x)
{
	if (*u==0)
	{
		++x->na;
		return;
	}
	
	if (x->fii[*u-'a']==0)
	{
		x->fii[*u-'a']=new Nod;
		++x->ns;
	}
	
	Add(u+1, x->fii[*u-'a']);
}

bool Erase(char *u, Nod *x)
{
	if (*u==0)
		--x->na;
		
	else if (Erase(u+1, x->fii[*u-'a'])==1)
	{
		--x->ns;
		x->fii[*u-'a']=0;
	}
	
	if (x!=R && x->ns==0 && x->na==0)
	{
		delete x;
		return 1;
	}	
	
	
	return 0;
}
 
 
int Nr(char *u, Nod *x) 
{
	if (*u==0)
		return x->na;
		
	if (x->fii[*u-'a'])
		return Nr(u+1, x->fii[*u-'a']);
		
	return 0;
}
 
int Prefix(char *u, Nod *x, int k)
{
	if (*u==0)
		return k;
			
	if (x->fii[*u-'a'])
		return Prefix(u+1, x->fii[*u-'a'], k+1);
	
	return k;
}
 
int main()
{
	
	while(cin>>o>>t)
	{
		if (o==0)
			Add(t, R);
		if (o==1)
			Erase(t, R);
		if (o==2)
			cout<<Nr(t, R)<<'\n';
		if (o==3)
			cout<<Prefix(t, R, 0)<<'\n';
		
	}

 	
    return 0;
}