Cod sursa(job #336635)

Utilizator prdianaProdan Diana prdiana Data 31 iulie 2009 22:26:36
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>
#include <string.h>

struct trie
{
	trie *nxt[26];
	int nr;
	trie();
};

trie::trie()
{
	nr = 0;
	memset(nxt,0,sizeof(nxt));
}

trie *t = new trie;
trie *r = t;
char s[32];
int i,l,max;
inline void insert()
{
	l=strlen(s);
	t = r;
	for (i=0;i<l;i++)
	{
		if (t->nxt[s[i]-'a'] == 0)
		{
			t->nxt[s[i]-'a'] = new trie;
			t->nxt[s[i]-'a']->nr = 0;
		}
		if (i==l-1)
		{
			t->nxt[s[i]-'a']->nr++;
		}
		t = t->nxt[s[i]-'a'];
	}
}

inline void del()
{
	l=strlen(s);
	t = r;
	for (i=0;i<l;i++)
	{
		if (t->nxt[s[i]-'a'] == 0)
		{
			return;
		}
		t = t->nxt[s[i]-'a'];
	}
	if (t->nr>0)
	{
		t->nr--;
	}
}

inline void prefix()
{
	l=strlen(s);
	t = r;
	max = 0;
	for (i=0;i<l;i++)
	{
		
		if (t->nxt[s[i]-'a'] == 0)
		{
			printf("%d\n",max);
			return;
		}
		max++;
		t = t->nxt[s[i]-'a'];
	}
	if (t->nr != 0)
	{
		printf("%d\n",l-1);
	}
	else
	{
		printf("%d\n",max);
	}
}

inline void type()
{
	l=strlen(s);
	t = r;
	for (i=0;i<l;i++)
	{
		if (t->nxt[s[i]-'a'] == 0)
		{
			printf("0\n");
			return;
		}
		t = t->nxt[s[i]-'a'];
	}
	printf("%d\n",t->nr);
}

int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	int op;
	while (!feof(stdin))
	{
		scanf("%d %s",&op,&s);
		switch(op)
		{
		case 0:
			insert();break;
		case 1:
			del();break;
		case 2:
			type();break;
		case 3:
			prefix();break;
		}
	}
	t= r;

	return 0;
}