summaryrefslogtreecommitdiff
path: root/kattis-kth-alginda-quicksort/radix64.c
diff options
context:
space:
mode:
authormathiasmagnusson <mathiasmagnussons@gmail.com>2022-12-09 18:00:41 +0100
committermathiasmagnusson <mathiasmagnussons@gmail.com>2022-12-09 18:00:41 +0100
commita1eb38bebe6ce1668c3f96489506c3b05b9fe5cb (patch)
treecccf0fd4763dba123efab7c896292dc18d1eb458 /kattis-kth-alginda-quicksort/radix64.c
parente41e6c8bc72e3300a0fa137f198454341bc315b1 (diff)
downloadprogramming-problem-solving-a1eb38bebe6ce1668c3f96489506c3b05b9fe5cb.tar.gz
Move stuff around
Diffstat (limited to 'kattis-kth-alginda-quicksort/radix64.c')
-rw-r--r--kattis-kth-alginda-quicksort/radix64.c95
1 files changed, 0 insertions, 95 deletions
diff --git a/kattis-kth-alginda-quicksort/radix64.c b/kattis-kth-alginda-quicksort/radix64.c
deleted file mode 100644
index 54b0155..0000000
--- a/kattis-kth-alginda-quicksort/radix64.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/* https://kth.kattis.com/problems/kth.alginda.quicksort */
-
-#include <stdbool.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <unistd.h>
-
-// longest int: -2147483648
-#define BUFFER_MAX (12 * 600000)
-char buffer[BUFFER_MAX];
-long xs[600000];
-long tmp[600000];
-
-void radix_sort(int n) {
- long *out = xs;
- long *in = tmp;
- // we loop an even amount of times so the completely sorted array
- // will be in xs, not tmp
- for (int m = 0; m < 40; m += 8) {
- long *tmp = out;
- out = in;
- in = tmp;
-
- int counts[256] = { 0 };
- for (int i = 0; i < n; i++)
- counts[(uint8_t) (in[i] >> m)]++;
-
- int sum = 0;
- for (int i = 0; i < 256; i++) {
- sum += counts[i];
- counts[i] = sum;
- }
- for (int i = n - 1; i >= 0; i--) {
- uint8_t fx = in[i] >> m;
- counts[fx]--;
- out[counts[fx]] = in[i];
- }
- }
-}
-
-int main() {
- ssize_t len = read(0, buffer, BUFFER_MAX);
-
- char *p = buffer;
- int n = 0;
- while (*p != ' ') {
- n *= 10;
- n += *p - '0';
- p++;
- }
-
- p = &buffer[len - 1];
- for (int i = n - 1; i >= 0; i--) {
- while (*p == ' ' || *p == '\n') p--;
-
- long x = 0;
-
- bool c = true;
- if (c) x += (long)(*p-- - '0') << 0; if (*p == ' ' || *p == '\n') c = false;
- if (c) x += (long)(*p-- - '0') << 4; if (*p == ' ' || *p == '\n') c = false;
- if (c) x += (long)(*p-- - '0') << 8; if (*p == ' ' || *p == '\n') c = false;
- if (c) x += (long)(*p-- - '0') << 12; if (*p == ' ' || *p == '\n') c = false;
- if (c) x += (long)(*p-- - '0') << 16; if (*p == ' ' || *p == '\n') c = false;
- if (c) x += (long)(*p-- - '0') << 20; if (*p == ' ' || *p == '\n') c = false;
- if (c) x += (long)(*p-- - '0') << 24; if (*p == ' ' || *p == '\n') c = false;
- if (c) x += (long)(*p-- - '0') << 28; if (*p == ' ' || *p == '\n') c = false;
- if (c) x += (long)(*p-- - '0') << 32; if (*p == ' ' || *p == '\n') c = false;
- if (c) x += (long)(*p-- - '0') << 36;
-
- xs[i] = x;
- }
-
- radix_sort(n);
-
- p = &buffer[BUFFER_MAX - 1];
- char *last = p;
- *p-- = '\n';
- for (int i = n - 1; i >= 0; i--) {
- long x = xs[i];
- *p-- = (x & 0xf) + '0'; x >>= 4;
- if (x) *p-- = (x & 0xf) + '0'; x >>= 4;
- if (x) *p-- = (x & 0xf) + '0'; x >>= 4;
- if (x) *p-- = (x & 0xf) + '0'; x >>= 4;
- if (x) *p-- = (x & 0xf) + '0'; x >>= 4;
- if (x) *p-- = (x & 0xf) + '0'; x >>= 4;
- if (x) *p-- = (x & 0xf) + '0'; x >>= 4;
- if (x) *p-- = (x & 0xf) + '0'; x >>= 4;
- if (x) *p-- = (x & 0xf) + '0'; x >>= 4;
- if (x) *p-- = (x & 0xf) + '0'; x >>= 4;
- if (i > 0) *p-- = '\n';
- }
- write(1, p + 1, last - p);
-}