Cod sursa(job #330502)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 10 iulie 2009 11:58:18
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>
#include <cstring>

#define file_in "trie.in"
#define file_out "trie.out"

struct trie
{
	int nrc,cnt;
	trie *a[26];
	trie()
	{
		memset(a,0,sizeof(a));
		nrc=cnt=0;
    }
}*rad=new trie;

int tip;   
char s[32];  

void insert_trie(trie *nod, char s[])
{
	if (s[0]=='\n')
	{
		nod->cnt++;
		return ;
	}
	if (nod->a[s[0]-'a']==0)
	{
		nod->nrc++;
		nod->a[s[0]-'a'] = new trie;
	}
	
	insert_trie(nod->a[s[0]-'a'],s+1);
}

int delete_trie(trie *nod, char s[])
{
	if (s[0]=='\n')
	{
		nod->cnt--;
	}
	else
	if (delete_trie(nod->a[s[0]-'a'],s+1))
	{
		nod->nrc--;
		nod->a[s[0]-'a']=0;
	}
	if (!nod->nrc && !nod->cnt && nod!=rad)
	{
		delete(nod);
		return 1;
	}
	
	return 0;
}

int cauta_trie(trie *nod, char s[])
{
	if (s[0]=='\n')
		return nod->cnt;
	if (nod->a[s[0]-'a'])
	    return cauta_trie(nod->a[s[0]-'a'],s+1);
	return 0;
}

int prefix_trie(trie *nod, char s[], int lvl)
{
	if (s[0]=='\n')
		return lvl;
	if (nod->a[s[0]-'a'])
		return prefix_trie(nod->a[s[0]-'a'],s+1,lvl+1);
	return lvl;
}



int main()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d ", &tip);
	fgets(s,25,stdin);
	while(!feof(stdin))
	{
		if (tip==0)
		{
			insert_trie(rad,s);
		}
		if (tip==1)
		{
			delete_trie(rad,s);
		}
		if (tip==2)
		{
			printf("%d\n", cauta_trie(rad,s));
		}
		if (tip==3)
		{
			printf("%d\n", prefix_trie(rad,s,0));
		}
		scanf("%d ", &tip);
		fgets(s,25,stdin);
	}
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}