Cod sursa(job #2618845)

Utilizator radustn92Radu Stancu radustn92 Data 26 mai 2020 13:44:05
Problema Radix Sort Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>
#include <vector>
#include <fstream>
#include <cstring>
using namespace std;
const int NMAX = 10000505;
const int LMAX = (1 << 8);

int N, A, B, C;
int nums[2][NMAX];
int sliceStart[LMAX], cntByte[LMAX];

inline int getValue(int& value, int from, int toExclusive) {
	long long temp = ((1LL << toExclusive) - 1) & value;
	return temp >> from;
}

int main() {
	ifstream in("radixsort.in");
	ofstream out("radixsort.out");	

	in >> N >> A >> B >> C;
	nums[0][1] = B;
	for (int idx = 2; idx <= N; idx++) {
		nums[0][idx] = (1LL * nums[0][idx - 1] * A + B) % C;
	}

	for (int byteIdx = 0; byteIdx < 4; byteIdx++) {
		memset(cntByte, 0, sizeof(cntByte));
		for (int idx = 1; idx <= N; idx++) {
			int byteValue = getValue(nums[byteIdx & 1][idx], byteIdx * 8, (byteIdx + 1) * 8);
			cntByte[byteValue]++;
		}
		sliceStart[0] = 1;
		for (int value = 1; value < LMAX; value++) {
			sliceStart[value] = sliceStart[value - 1] + cntByte[value - 1];
		}

		for (int idx = 1; idx <= N; idx++) {
			int byteValue = getValue(nums[byteIdx & 1][idx], byteIdx * 8, (byteIdx + 1) * 8);
			nums[(byteIdx + 1) & 1][sliceStart[byteValue]++] = nums[byteIdx & 1][idx];
		}
	}

	for (int idx = 1; idx <= N; idx += 10) {
		out << nums[0][idx] << " ";
	}
	out << "\n";
	return 0;
}