Cod sursa(job #1096156)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 1 februarie 2014 16:50:21
Problema Radix Sort Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
#include<iostream>
#include<string.h>

using namespace std;

#define max_n 10000010
#define nr_oct 4

int V[max_n] , V2[max_n];
int n , a , b , c;

ifstream f("radixsort.in");
ofstream g("radixsort.out");

void read(){
	
	f>>n>>a>>b>>c;
	
	V[0] = b % c;
	
	for( int i = 1 ; i < n ; i++ )
		V[i] = ( (long long)V[i-1] * a + b ) % c;
	
}

inline int get_oct( int x , int oct ){
	return (x >> ( oct * 8 )) & 0xFF;
}

void count( int A[] , int B[] , int oct ){
	
	int count[1<<8] , index[1<<8];
	
	memset(count , 0 , sizeof(count));
	
	for( int i = 0 ; i < n ; i++ )
		count[ get_oct(A[i] , oct) ]++;
	
	index[0] = 0;
	
	for( int i = 1 ; i < (1<<8) ; i++ )
		index[i] = index[i-1] + count[i-1];
	
	for( int i = 0 ; i < n ; i++ )
		B[ index[ get_oct(A[i] , oct) ]++ ] = A[i];
}

void print(){
	
	for( int i = 0 ; i < n ; i += 10 )
		g<<V[i]<<" ";
	
}

int main(){
	
	read();
	
	for( int i = 0 ; i < nr_oct ; i++ ){
		if( i % 2 == 0 )
			count( V , V2 , i );
		else
			count( V2 , V , i );
	}
	
	print();
	
	return 0;
}