Cod sursa(job #327875)

Utilizator TabaraTabara Mihai Tabara Data 30 iunie 2009 15:18:59
Problema Triplete Scor 90
Compilator c Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define in "triplete.in"
#define out "triplete.out"

#define NMAX 513
#define MASK (0x80)
#define BYTEMAX 257

typedef struct set {
	char *f;
} *PSet, Set;

PSet L;
int N, M, nrsol;
int cnt[BYTEMAX];

void Add ( int i, int j )
{
	unsigned char a = MASK;
	int R, C;
	C = (j>>3);
	R = j-(C<<3);
	a >>= R;
	L[i].f[C] |= a;
}

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

	unsigned char a;
	int X, Y, i;
	char sep[] = " \n";
	char buffer[11];
	char *p;

	scanf ( "%d %d\n", &N, &M );
	
	L = (PSet)calloc ( N+1,sizeof(Set) );
	for ( i = 1; i <= N; ++i )
		L[i].f = (char*)calloc ( (N>>3), sizeof(char) );
	
	for ( i = 1; i <= BYTEMAX-2; ++i )
		cnt[i] = cnt[i>>1] + (i&1);
	
	for ( ; M; --M )
	{
		fgets ( buffer, 11, stdin );
		p = strtok ( buffer, sep );
		X = atoi ( p );
		p = strtok ( 0, sep );
		Y = atoi ( p );
	
		Add ( X, Y );
		Add ( Y, X );
				
	}

	fseek ( stdin, 0, SEEK_SET );
	scanf ( "%d %d\n", &N, &M );

	for ( ; M; --M )
	{
		fgets ( buffer, 11, stdin );
		p = strtok ( buffer, sep );
		X = atoi ( p );
		p = strtok ( 0, sep );
		Y = atoi ( p );
			
		for ( i = 0; i <= (N>>3); ++i )
		{	
			a = ((L[X].f[i])&(L[Y].f[i]));
			nrsol += cnt[a];
		}
	}

	printf ( "%d\n", (nrsol/3));
	
	for ( i = 1; i <= N; ++i )
		free ( L[i].f );
	free ( L );

	return 0;
}