Cod sursa(job #602072)

Utilizator maritimCristian Lambru maritim Data 8 iulie 2011 22:34:38
Problema Trie Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<ctype.h>

#define MaxL 26
#define MaxN 21

typedef struct _trie
{
	int info;
	int infop;
	struct _trie *L[27];
} 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<=25;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])
{
	int AllNull = 1;
		
	p->infop --;
	
	if(isalpha(S[i]))
		TrieDelete(p->L[S[i]-'a'],i+1,S);
	else
		p->info --;
}

int TrieNrAp(Trie*& p,int i,char S[MaxN])
{
	if(!p)
		return 0;
	
	if(isalpha(S[i]))
		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(isalpha(S[i]))
		return TrieMaxPre(p->L[S[i]-'a'] , i + 1 , S , MAX);
	else
		return MAX;
}

int main()
{
	FILE *f = fopen("trie.in","r");
	FILE *g = fopen("trie.out","w");
	

	fscanf(f,"%d %s",&stare,&S);
	while(!feof(f))
	{
		switch(stare)
		{
			case 0 : add(cap,0,S);
				break;
			case 1 : TrieDelete(cap,0,S);
				break;
			case 2 : fprintf(g,"%d\n",TrieNrAp(cap,0,S));
				break;
			case 3 : fprintf(g,"%d\n",TrieMaxPre(cap,0,S,0));
				break;
		}
		fscanf(f,"%d %s",&stare,&S);
	}
	
	fclose(g);
	fclose(f);
	return 0;
}