提交记录 10384
| 提交时间 |
评测时间 |
| 2019-09-17 20:28:33 |
2020-08-01 02:13:58 |
#include "router.h"
#include <cstdio>
#include <cstdlib>
#include <cstdint>
#include <cstddef>
#include <cstring>
#include <arpa/inet.h>
struct rt_entry
{
uint32_t net;
uint32_t prefixlen;
uint32_t nexthop;
};
struct rt_node
{
const rt_entry *entry = nullptr;
rt_node *prev = nullptr, *next[2] = { nullptr, nullptr };
// uint8_t prefixlen;
};
struct rt
{
rt_node root;
};
void rt_insert(rt_node *root, const rt_entry *e)
{
rt_node *node = root;
uint32_t net = ntohl(e->net);
for (int l = 0; l < e->prefixlen; ++l)
{
int i = (net & 0x80000000) != 0;
if (!node->next[i])
{
node->next[i] = new rt_node();
node->next[i]->prev = node;
}
node = node->next[i];
net <<= 1;
}
node->entry = e;
}
const rt_entry *rt_find(rt_node *root, uint32_t addr)
{
rt_node *node = root;
for (int l = 0; l < 32; ++l)
{
int i = (addr & 0x80000000) != 0;
if (!node->next[i]) break;
node = node->next[i];
addr <<= 1;
}
while (node)
{
if (node->entry) return node->entry;
node = node->prev;
}
return nullptr;
}
void print_ipv4(uint32_t addr)
{
addr = htonl(addr);
char str[INET6_ADDRSTRLEN];
inet_ntop(AF_INET, &addr, str, sizeof(str));
printf("%s", str);
}
rt r;
void init(int n, int q, const RoutingTableEntry *a) {
for (size_t i = 0; i < n; ++i)
{
rt_insert(&r.root, (const rt_entry *)&a[i]);
}
}
unsigned query(unsigned addr) {
const rt_entry *e = rt_find(&r.root, ntohl(addr));
if (e) return e->nexthop;
return 0;
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 12.39 us | 28 KB | Accepted | Score: 25 | 显示更多 |
| Testcase #2 | 50.08 ms | 94 MB + 520 KB | Accepted | Score: 25 | 显示更多 |
| Testcase #3 | 197.463 ms | 94 MB + 520 KB | Accepted | Score: 25 | 显示更多 |
| Testcase #4 | 344.018 ms | 94 MB + 520 KB | Accepted | Score: 25 | 显示更多 |
Judge Duck Online | 评测鸭在线
Server Time: 2026-03-29 16:07:44 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠