Cod sursa(job #739139)

Utilizator Marius96Marius Gavrilescu Marius96 Data 22 aprilie 2012 11:56:28
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<cstdio>
#include<cstdlib>
#include<cstring>

char s[25];
struct node
{
	int n;
	node* c[26];
	node()
		{
			n=0;
		}
}rt;

void ins()
{
	int n=strlen (s);
	node *p=&rt;
	for(int i=0;i<n;i++){
		int idx=s[i]-'a';
		if(!p->c[idx])
			p->c[idx]=(node*)malloc (sizeof(node));
		p=p->c[idx];
	}
	p->n++;
}

bool _del(node *p,int i,int l)
{
	if(i==l){
		p->n--;
		if(p->n==0){
			free (p);
			return true;
		}
		return false;
	}
	node *np=p->c[s[i]-'a'];
	if(_del (np,i+1,l)){
		p->c[s[i]-'a']=0;
		if(p->n)
			return false;
		bool empty=true;
		for(int i=0;i<26;i++)
			if(p->c[i]){
				empty=false;
				break;
			}
		if(empty)
			free (p);
		return empty;
	}
	return false;
}

void del()
{
	_del (&rt,0,strlen (s));
}

int cnt()
{
	node *np=&rt;
	int l=strlen (s);
	for(int i=0;i<l;i++)
		np=np->c[s[i]-'a'];
	return np->n;
}

int prf()
{
	node *np=&rt;
	int l=strlen (s);
	for(int i=0;i<l;i++){
		int idx=s[i]-'a';
		if(!np->c[idx])
			return i;
		np=np->c[idx];
	}
	return l;
}

int main()
{
	freopen ("trie.in","r",stdin);
	freopen ("trie.out","w",stdout);
	while(1){
		int o=-1;
		scanf ("%d ",&o);
		if(o==-1)
			return 0;
		gets (s);
		switch(o){
		case 0:
			ins();
			break;
		case 1:
			del();
			break;
		case 2:
			printf ("%d\n",cnt());
			break;
		case 3:
			printf ("%d\n",prf());
			break;
		}
	}
}