Cod sursa(job #538611)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 21 februarie 2011 18:58:48
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<stdio.h>
#include<string.h>

#define MOD 67000
#define MAX 100005
#define MAXC 21

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

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) {
			sol*=n;
			sol%=MOD;
		}
		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() {
	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);
}