提交记录 39997
| 提交时间 |
评测时间 |
| 2026-08-17 05:21:08 |
2026-08-17 05:21:11 |
#include "router.h"
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
// flat /16 fill: A[65536] u32 (L2-resident) + hasDeep bitset (L1) + O[65536] u32
// (read only on deep path) + per-slice 256-slot u32 arena (raw nexthop).
// len>=25: arena slot = SENTINEL -> per-/24 256-u32 L3 (binary search, rare).
#define SENTINEL 0xFFFFFFFFu
static uint32_t *A;
static uint8_t *hasDeep;
static uint32_t *O;
static uint32_t *arena;
static uint32_t *L3;
static uint32_t *l3key;
static uint32_t *l3off;
static uint32_t l3cnt;
void init(int n, int q, const RoutingTableEntry *a){
(void)q;
A = (uint32_t*)calloc(65536, 4);
hasDeep = (uint8_t*)calloc(8192, 1);
O = (uint32_t*)malloc((size_t)65536 * 4);
arena = (uint32_t*)malloc((size_t)65536 * 256 * 4);
L3 = (uint32_t*)malloc((size_t)n * 256 * 4);
l3key = (uint32_t*)malloc((size_t)n * 4);
l3off = (uint32_t*)malloc((size_t)n * 4);
l3cnt = 0;
uint32_t deep_ordinal = 0;
uint32_t l3cur = 0;
for (int i = 0; i < n; i++) {
uint32_t v = __builtin_bswap32(a[i].addr);
uint32_t len = a[i].len;
uint32_t nh = a[i].nexthop;
if (len <= 16) {
uint32_t shift = 16 - len;
uint32_t count = 1u << shift;
uint32_t mask = count - 1;
uint32_t base = (v >> 16) & ~mask;
uint32_t end = base | mask;
for (uint32_t x = base; x <= end; x++) A[x] = nh;
} else {
uint32_t s = v >> 16;
uint32_t idx = s >> 3;
uint32_t bit = 1u << (s & 7);
uint32_t o;
if (!(hasDeep[idx] & bit)) {
hasDeep[idx] |= bit;
deep_ordinal++;
o = deep_ordinal * 256;
O[s] = o;
// prefill arena[o..o+255] = A[s] via 64-bit double stores
uint64_t dvd = ((uint64_t)A[s] << 32) | A[s];
uint64_t *pp = (uint64_t*)(arena + o);
for (uint32_t c = 0; c < 128; c++) pp[c] = dvd;
} else {
o = O[s];
}
if (len <= 24) {
uint32_t shift = 24 - len;
uint32_t count = 1u << shift;
uint32_t mask = count - 1;
uint32_t slot = (v >> 8) & 255;
uint32_t base = slot & ~mask;
uint32_t end = base | mask;
for (uint32_t x = base; x <= end; x++) arena[o + x] = nh;
} else {
uint32_t slot = (v >> 8) & 255;
uint32_t *e = &arena[o + slot];
if (*e != SENTINEL) {
uint32_t l3 = l3cur; l3cur += 256;
uint32_t dv = *e;
uint64_t dvd = ((uint64_t)dv << 32) | dv;
uint64_t *pp = (uint64_t*)(L3 + l3);
for (uint32_t c = 0; c < 128; c++) pp[c] = dvd;
*e = SENTINEL;
l3key[l3cnt] = v >> 8;
l3off[l3cnt] = l3;
l3cnt++;
}
uint32_t l3 = l3off[l3cnt - 1];
uint32_t shift = 32 - len;
uint32_t count = 1u << shift;
uint32_t mask = count - 1;
uint32_t base = v & ~mask;
uint32_t end = base | mask;
for (uint32_t x = base; x <= end; x++) L3[l3 + (x & 255)] = nh;
}
}
}
}
static inline uint32_t lookup(uint32_t h){
uint32_t s = h >> 16;
uint32_t ans = A[s];
if (hasDeep[s >> 3] & (1u << (s & 7))) {
ans = arena[O[s] + ((h >> 8) & 255)];
if (ans == SENTINEL) {
uint32_t k = h >> 8;
uint32_t lo = 0, hi = l3cnt;
while (lo < hi) {
uint32_t mid = (lo + hi) >> 1;
if (l3key[mid] < k) lo = mid + 1; else hi = mid;
}
ans = L3[l3off[lo] + (h & 255)];
}
}
return ans;
}
unsigned query(unsigned addr){ return lookup(__builtin_bswap32(addr)); }
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 37.99 us | 308 KB | Accepted | Score: 25 | 显示更多 |
| Testcase #2 | 12.64 ms | 38 MB + 308 KB | Accepted | Score: 25 | 显示更多 |
| Testcase #3 | 30.344 ms | 38 MB + 308 KB | Accepted | Score: 25 | 显示更多 |
| Testcase #4 | 47.943 ms | 38 MB + 308 KB | Accepted | Score: 25 | 显示更多 |
Judge Duck Online | 评测鸭在线
Server Time: 2026-09-03 21:18:51 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠