Cod sursa(job #197162)

Utilizator gigi_becaliGigi Becali gigi_becali Data 2 iulie 2008 08:59:59
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <vector>
#define B 18
#define maxh 200003
using namespace std;

struct nod { int v; nod *n;};

//nod *H[maxh];
int *H[maxh];
int R;

inline int isprime(int n)
{
	if(n%2==0) return 0;
	for(int i=3;i*i<=n;i+=2)
		if(n%i==0)return 0;
	return 1;
}

inline void getR()
{
	for(R=200000;;++R)
		if(isprime(R)) break;
}

inline void insert(int v)
{
	int h=v%maxh;//(unsigned)(R*v)>>(32-B);
	H[h]=(int*)realloc(H[h], sizeof(int)*(H[h][0]+2));
	H[h][++H[h][0]]=v;
//	if(H[h][0]>20) printf("damn\n");

	//nod *p=new nod;
	//p->v=v;
	//p->n=H[h];
//	H[h]=p;
}

inline int find(int v)
{
	int h=v%maxh;//(unsigned) (R*v)>>(32-B);
	for(int i=1;i<=H[h][0];++i)
	    if(H[h][i]==v)return 1;
	
//	for(nod *p=H[h]; p; p=p->n)
//		if(p->v==v)return 1;
	return 0;
}

void init()
{
    for(int i=0;i<maxh;++i) H[i]=new int[2], H[i][0]=0;
}

int main()
{
    init();
    getR();
//	srand(time(0));
//	R=(rand()<<1)|1;
	printf("%d\n", R);

	int n=1000000,i;
	for(i=1;i<=n;++i) insert(rand()%100000000);
	for(i=1;i<=n;++i) find(rand()%100000000);
	

	int mx=0;
	for(i=0;i<maxh;++i) if(H[i][0]>mx)mx=H[i][0];
	printf("%d\n", mx);	
	return 0;
}