Cod sursa(job #538514)

Utilizator cdascaluDascalu Cristian cdascalu Data 21 februarie 2011 16:52:31
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<stdio.h>
#include<string.h>
#define MOD 100003
#define MAX 100005
#define MAXC 21
FILE*g = fopen("trie.out","w");
char C[MAX][MAXC],var[MAXC];
int H[MOD],V[MAX],N;
int put(int n, int p)
{
	int sol = 1;
	while(p)
	{
		if(p%2 != 0){sol*=n;sol%=MOD;--p;}
		n*=n;
		n%=MOD;
		p/=2;
	}
	return sol;
}
void add(char sir[])
{
	int cod,size = strlen(sir),i;
	for(i=cod=0;i<size;++i)
	{
		cod+=put(sir[i],i);
		cod%=MOD;
	}
	if(H[cod])
		++V[H[cod]];
	else
	{
		H[cod] = ++N;
		strcpy(C[N], sir);
		V[N] = 1;
	}
}
void erase(char sir[])
{
	int cod,size = strlen(sir),i;
	for(i=cod=0;i<size;++i)
	{
		cod+=put(sir[i], i);
		cod%=MOD;
	}
	if(V[H[cod]])
		--V[H[cod]];
}
void tipar(char sir[])
{
	int cod,size = strlen(sir),i;
	for(i=cod=0;i<size;++i)
	{
		cod+=put(sir[i], i);
		cod%=MOD;
	}
	fprintf(g,"%d\n", V[H[cod]]);
}
void prefix(char sir[])
{
	int i,size = strlen(sir),j,max = -MOD;
	char aux[MAXC];
	strcpy(aux, var);
	for(i=1;i<=N;++i)
	{
		strcpy(aux,sir);
		if(V[i]>0&&strcmp(aux, C[i]))
		for(j = size;j>=0 && j>max;--j)
		{
			aux[j] = 0;
			if(strstr(C[i], aux) == C[i])max = j;
		}
	}
	fprintf(g,"%d\n",max);
}
int main()
{
	FILE*f = fopen("trie.in","r");
	char sir[MAXC];
	int var;
	while(!feof(f))
	{
		var = -1;
		fscanf(f,"%d ",&var);
		fscanf(f,"%s", sir);
		switch(var)
		{
			case 0:{add(sir);break;}
			case 1:{erase(sir);break;}
			case 2:{tipar(sir);break;}
			case 3:{prefix(sir);break;}
			default:break;
		}	
	}
	fclose(f);
	fclose(g);
}