Cod sursa(job #2225803)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 28 iulie 2018 12:26:56
Problema Radix Sort Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("radixsort.in");
ofstream fout("radixsort.out");

queue<int> counter[256], aux_counter[256];
unsigned int aux;

int main() {
    
    int n, a, b, c, i, j;
    
    fin >> n >> a >> b >> c;
    fin.close();
    
    int cr, prev;
    
    // byte 0
    cr = b;
    aux = cr & 255;
    counter[aux].push(cr);
    prev = cr;
    
    for (i = 2; i <= n; i++) {
        cr = ((1LL * a * prev) % c + b) % c;
        aux = cr & 255;
        counter[aux].push(cr);
        prev = cr;
    }
    
    // byte 1
    
    for (i = 0; i < 256; i++) {
        
        while (!counter[i].empty()) {
            cr = counter[i].front();
            counter[i].pop();
            aux = (cr >> 8) & 255;
            aux_counter[aux].push(cr);
        }
    }
    
    // byte 2
    
    for (i = 0; i < 256; i++) {
        
        while (!aux_counter[i].empty()) {
            cr = aux_counter[i].front();
            aux_counter[i].pop();
            aux = (cr >> 16) & 255;
            counter[aux].push(cr);
        }
    }
    
    // byte 3
    
    for (i = 0; i < 256; i++) {
        
        while (!counter[i].empty()) {
            cr = counter[i].front();
            counter[i].pop();
            aux = (cr >> 24) & 255;
            aux_counter[aux].push(cr);
        }
    }
    
    // print
    prev = 0;
    for (i = 0; i < 256; i++) {
        
        while (!aux_counter[i].empty()) {
            cr = aux_counter[i].front();
            aux_counter[i].pop();
            if (prev % 10 == 0) {
                fout << cr << " ";
                prev = 1;
            }
            else prev++;
        }
    }
    
    fout.close();    
    
    return 0;
}