Cod sursa(job #602095)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 9 iulie 2011 00:26:38
Problema Trie Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<ctype.h>

#define MaxL 30
#define MaxN 21

typedef struct _trie
{
	int info;
	int infop;
	struct _trie *L[MaxL];
} Trie;

Trie *cap = NULL;
int N;
int stare;
char S[MaxN];

void Creat(Trie*& P)
{
	P = (Trie*)malloc(sizeof(Trie));
	P->info = 0;
	for(int i=0;i<MaxL;i++)
		P->L[i] = NULL;
}

void add(Trie*& p,int i,char S[MaxN])
{
	if(!p)
		Creat(p);
	
	p->infop ++;
	
	if(isalpha(S[i]))
		add(p->L[S[i]-'a'] , i + 1 , S);
	else
		p->info ++;
}

void TrieDelete(Trie*& p,int i,char S[MaxN])
{		
	p->infop --;
	
	if(S[i]>='a' && S[i]<='z')
		TrieDelete(p->L[S[i]-'a'],i+1,S);
	else
		p->info --;
	
	if(p->infop == 0)
		p = NULL;
}

int TrieNrAp(Trie*& p,int i,char S[MaxN])
{
	if(!p)
		return 0;
	
	if(S[i]>='a' && S[i]<='z')
		return TrieNrAp(p->L[S[i]-'a'] , i + 1 , S);
	else
		return p->info;
}

int TrieMaxPre(Trie*& p,int i,char S[MaxN],int MAX)
{
	if(!p)
		return MAX;
	
	if(p->infop > 1)
		MAX = i;
	
	if(S[i]>='a' && S[i]<='z')
		return TrieMaxPre(p->L[S[i]-'a'] , i + 1 , S , MAX);
	else
		return MAX;
}

int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);	

	while((scanf("%d",&stare)!=EOF) && (scanf("%s",S)!=EOF))
	{
		switch(stare)
		{
			case 0 : add(cap,0,S);
				break;
			case 1 : TrieDelete(cap,0,S);
				break;
			case 2 : printf("%d\n",TrieNrAp(cap,0,S));
				break;
			case 3 : printf("%d\n",TrieMaxPre(cap,0,S,0));
				break;
			default : break;
		}
	}

	return 0;
}