Cod sursa(job #2092572)

Utilizator ArctopusKacso Peter-Gabor Arctopus Data 21 decembrie 2017 22:43:53
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <iostream>
#include <queue>

#define ll long long


using namespace std;

const int NLIM = 1e7 + 10;
const int BUCKNR = 70000;

ll N, A, B, C;
int *v;//[NLIM];
int *v2;//[NLIM];
int cnt[BUCKNR];
int cnt2[BUCKNR];
int index[BUCKNR];
ll x;




ll getLastBits( ll a, int l )
{
	return ( ( a >> l ) << l );
}

ll getFirstBits( ll a, int l )
{
	return a - getLastBits( a, l );
}

ll getBits( ll a, int x, int y )
{
	return a - getFirstBits( a, x ) - getLastBits( a, y );
}


ifstream fcin("radixsort.in");
ofstream fcout("radixsort.out");
int main()
{
	v = new int[NLIM];
	v2 = new int[NLIM];

	fcin >> N >> A >> B >> C;

	// generate input
	v[0] = B % C;
	for( int i = 1; i < N; ++i )
		v[i] = ( (ll)v[i - 1] * A  + B ) % C;	


	
	int NR = 2;
	int BYTES = 16;
	for( int i = 0; i < NR; ++i )
	{
		for( int j = 0; j < BUCKNR; ++j ) cnt[j] = cnt2[j] = 0;

		// counting sort:
		for( int j = 0; j < N; ++j )
		{
			x = getBits(   v[j] , i * BYTES, ( i + 1 ) * BYTES );
			x = x >> ( BYTES * i );
			
			++cnt[x];
		}

		
		int sum = 0; cnt2[0] = 0;
		for( int j = 1; j < BUCKNR; ++j )
		{
			sum += cnt[j - 1];
			cnt2[j] = sum;
		}		

	
		int vi = 0;
		// get the numbers from the buckets:
		for( int j = 0; j < N; ++j )
		{
			x = getBits(   v[j] , i * BYTES, ( i + 1 ) * BYTES );
			x = x >> ( BYTES * i );
			v2[cnt2[x]] = v[j];
			++cnt2[x];
		}
		

		int* emp = v;
		v = v2;
		v2 = emp;
	}


	for( int i = 0; i < N; ++i )
		if( i % 10 == 0 )
			fcout << v[i] << " ";
	fcout << "\n";

}
//   100 12 38 123
//	10 1 1 100