Cod sursa(job #570870)

Utilizator crushackPopescu Silviu crushack Data 3 aprilie 2011 17:59:47
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#include <string.h>

const char IN[]="trie.in",OUT[]="trie.out";

int count;
char s[30];

struct nod{
	int cuv,nrEnd;
	nod *next[26];
	nod()
	{
		cuv=nrEnd=0;
		memset(next,0,sizeof(next));
	}
} *trie=new nod();

void insert(nod* trie,char *s)
{
	while (*s!='\0')
	{
		if (!trie->next[*s-'a'])
			trie->next[*s-'a']=new nod;
		trie=trie->next[*s-'a'];
		++trie->cuv;
		++s;
	}
	++trie->nrEnd;
}

void erase(nod* trie,char *s)
{
	while (*s!='\0' && trie)
	{
		trie=trie->next[*s-'a'];
		--trie->cuv;
		++s;
	}
	--trie->nrEnd;
}

int numCuv(nod* trie,char *s)
{
	while (*s!='\0' && trie)
	{
		trie=trie->next[*s-'a'];
		++s;
	}
	if (!trie)
		return 0;
	return trie->nrEnd;
}

int maxPref(nod* trie,char *s)
{
	int ret=0;
	while (trie->next[*s-'a'] && trie->next[*s-'a']->cuv>0 && *s!='\0')
	{
		++ret;
		trie=trie->next[*s-'a'];
		++s;
	}
	return ret;
}

int main()
{
	int c;
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	while (scanf("%d%s",&c,s)==2)
	{
		switch(c)
		{
			case 0:
				insert(trie,s);
				++trie->cuv;
				++count;
			break;
			case 1:
				erase(trie,s);
				--trie->cuv;
				--count;
			break;
			case 2:
				printf("%d\n",numCuv(trie,s));
			break;
			case 3:
				printf("%d\n",maxPref(trie,s));
			break;
		}
	}
	fclose(stdout);
	fclose(stdin);
	return 0;
}