#include <string.h>
typedef unsigned int u32;
typedef unsigned char u8;
static u32 tmp[134217728 + (1u<<22)] __attribute__((aligned(64)));
static u32 cnt[65536];
static u32 rbase[65536];
static u32 pbase[65536];
static u32 off[65536];
static u8 pos[65536];
static u32 staging[65536 * 32] __attribute__((aligned(64)));
static u32 scratch[1u<<21] __attribute__((aligned(64)));
static u32 scratch2[8192] __attribute__((aligned(64)));
static u32 bc[256];
static u32 bc2[256];
static u32 sstart[256];
static u32 spos[256];
static u32 scount[256];
static void scatter_top(u32 *src, u32 *dst, int n) {
int i, j;
for (j = 0; j < 65536; j++) cnt[j] = 0;
int n8 = n & ~7;
for (i = 0; i < n8; i += 8) {
cnt[src[i]>>16]++; cnt[src[i+1]>>16]++; cnt[src[i+2]>>16]++; cnt[src[i+3]>>16]++;
cnt[src[i+4]>>16]++; cnt[src[i+5]>>16]++; cnt[src[i+6]>>16]++; cnt[src[i+7]>>16]++;
}
for (; i < n; i++) cnt[src[i] >> 16]++;
{ u32 t = 0, p = 0; for (j = 0; j < 65536; j++) { u32 c = cnt[j]; rbase[j] = t; pbase[j] = p; t += c; p = (p + c + 31) & ~31u; } }
for (j = 0; j < 65536; j++) { off[j] = pbase[j]; pos[j] = 0; }
#define S1(X) do { u32 x_ = (X); u32 b_ = x_ >> 16; u32 p_ = pos[b_]; \
staging[b_ * 32 + p_] = x_; p_++; \
if (p_ == 32) { u32 go_ = off[b_]; __builtin_memcpy(dst+go_, staging+b_*32, 128); off[b_] = go_ + 32; p_ = 0; } \
pos[b_] = (u8)p_; } while (0)
int n8s = n & ~7;
for (i = 0; i < n8s; i += 8) {
S1(src[i]); S1(src[i+1]); S1(src[i+2]); S1(src[i+3]);
S1(src[i+4]); S1(src[i+5]); S1(src[i+6]); S1(src[i+7]);
}
for (; i < n; i++) S1(src[i]);
#undef S1
for (j = 0; j < 65536; j++) { u32 p = pos[j]; if (p > 0) memcpy(dst+off[j], staging+j*32, p*4); }
}
static void sort16(u32 *src, u32 *dst, int m) {
int i, j;
for (j = 0; j < 256; j++) bc[j] = 0;
int m8 = m & ~7;
for (i = 0; i < m8; i += 8) {
bc[src[i]&255]++; bc[src[i+1]&255]++; bc[src[i+2]&255]++; bc[src[i+3]&255]++;
bc[src[i+4]&255]++; bc[src[i+5]&255]++; bc[src[i+6]&255]++; bc[src[i+7]&255]++;
}
for (; i < m; i++) bc[src[i] & 255]++;
for (j = 1; j < 256; j++) bc[j] += bc[j-1];
int rm = m & ~15;
for (i = m - 1; i >= rm; i--) { u32 x = src[i]; dst[--bc[x & 255]] = x; }
for (i = rm - 1; i >= 0; i -= 8) {
u32 x0=src[i],x1=src[i-1],x2=src[i-2],x3=src[i-3],x4=src[i-4],x5=src[i-5],x6=src[i-6],x7=src[i-7];
dst[--bc[x0&255]]=x0;
dst[--bc[x1&255]]=x1;
dst[--bc[x2&255]]=x2;
dst[--bc[x3&255]]=x3;
dst[--bc[x4&255]]=x4;
dst[--bc[x5&255]]=x5;
dst[--bc[x6&255]]=x6;
dst[--bc[x7&255]]=x7;
}
}
static void sort_bucket(u32 *src, u32 *dst, int m) {
int i, j;
for (j = 0; j < 256; j++) bc[j] = 0;
int mb8 = m & ~7;
for (i = 0; i < mb8; i += 8) {
bc[(src[i]>>8)&255]++; bc[(src[i+1]>>8)&255]++; bc[(src[i+2]>>8)&255]++; bc[(src[i+3]>>8)&255]++;
bc[(src[i+4]>>8)&255]++; bc[(src[i+5]>>8)&255]++; bc[(src[i+6]>>8)&255]++; bc[(src[i+7]>>8)&255]++;
}
for (; i < m; i++) bc[(src[i] >> 8) & 255]++;
{ u32 t = 0; for (j = 0; j < 256; j++) { u32 c = bc[j]; scount[j] = c; sstart[j] = t; spos[j] = t; t += c; } }
for (i = 0; i < mb8; i += 8) {
u32 x0=src[i+0],b0=(x0>>8)&255; scratch[spos[b0]++]=x0;
u32 x1=src[i+1],b1=(x1>>8)&255; scratch[spos[b1]++]=x1;
u32 x2=src[i+2],b2=(x2>>8)&255; scratch[spos[b2]++]=x2;
u32 x3=src[i+3],b3=(x3>>8)&255; scratch[spos[b3]++]=x3;
u32 x4=src[i+4],b4=(x4>>8)&255; scratch[spos[b4]++]=x4;
u32 x5=src[i+5],b5=(x5>>8)&255; scratch[spos[b5]++]=x5;
u32 x6=src[i+6],b6=(x6>>8)&255; scratch[spos[b6]++]=x6;
u32 x7=src[i+7],b7=(x7>>8)&255; scratch[spos[b7]++]=x7;
}
for (; i < m; i++) { u32 x = src[i]; u32 b = (x >> 8) & 255; scratch[spos[b]++] = x; }
for (j = 0; j < 256; j++) { int c = scount[j]; if (c > 0) sort16(scratch + sstart[j], dst + sstart[j], c); }
}
void sort(unsigned *aa, int n) {
u32 *a = (u32*)aa;
int j;
scatter_top(a, tmp, n);
for (j = 0; j < 65536; j++) {
int m = (int)cnt[j];
if (m > 0) sort_bucket(tmp + pbase[j], a + rbase[j], m);
}
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 6.374 s | 1041 MB | Accepted | Score: 100 | 显示更多 |