Cod sursa(job #2810979)

Utilizator flibiaVisanu Cristian flibia Data 30 noiembrie 2021 19:21:27
Problema Radix Sort Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
// restrictii tampite
// cycle leader approach
#pragma GCC optimize("03")
#include <bits/stdc++.h>
 
using namespace std;
 
const int N = 1e7 + 10;
const int SIZE = 32;
const int RADIX = 8;
const int MASK = (1 << RADIX) - 1;
 
int n, a, b, c;
int v[N], firstPos[1 << RADIX], cnt[1 << RADIX];
 
int main() {
    ifstream cin("radixsort.in");
    ofstream cout("radixsort.out");
 
    cin >> n >> a >> b >> c;
 
    v[0] = b;
    for (int i = 1; i < n; i++) {
        v[i] = (1ll * a * v[i - 1] + b) % c;
    }
 
    for (int i = 0; i * RADIX < SIZE; i++) {
        memset(firstPos, 0, sizeof(firstPos));
        memset(cnt, 0, sizeof(cnt));

        const int bit_offset = i * RADIX;
        for (int j = 0; j < n; j++) {
            firstPos[(v[j] >> bit_offset) & MASK]++;
        }
    
        for (int j = 1; j < (1 << RADIX); j++) {
            firstPos[j] += firstPos[j - 1];
        }
        for (int j = (1 << RADIX) - 1; j > 0; j--) {
            firstPos[j] = firstPos[j - 1];
        }
        firstPos[0] = 0;
    
        int j = 0; 
        while (j < n) {
            int msk = (v[j] >> bit_offset) & MASK;
            if (firstPos[msk] <= j && (msk + 1 == (1 << RADIX) || j < firstPos[msk + 1])) {
                j++;
                cnt[msk]++;
                continue;
            } 

            swap(v[j], v[firstPos[msk] + cnt[msk]++]);
        }
    }
 
    for (int i = 0; i < n; i += 10) {
        cout << v[i] << ' ';
    }
 
    return 0;
}