提交记录 14178


用户 题目 状态 得分 用时 内存 语言 代码长度
chrogeek router32. 测测你的路由器 Runtime Error 0 2.197 ms 9712 KB C++ 1.30 KB
提交时间 评测时间
2020-09-17 09:50:17 2020-09-17 09:50:24
#include "router.h"

#include <cassert>
#include <vector>

struct Node {
	bool isEntry;
	unsigned nexthop;
	unsigned next[2];

	Node(): isEntry(false), nexthop(0), next({0, 0}) {}
};

std::vector<Node> nodes;

unsigned toLittleEndian(unsigned bigEndian) {
	return ((bigEndian & 0xffu) << 24) | ((bigEndian & 0xff00u) << 8) | ((bigEndian & 0xff0000u) >> 8) | ((bigEndian & 0xff000000u) >> 24);
}

void insert(const RoutingTableEntry &entry) {
	const unsigned addr = toLittleEndian(entry.addr), len = entry.len;
	int o = 0;
	for (unsigned i = 0; i < len; ++i) {
		const int digit = !!(addr & (1u << (31 - i)));
		assert(digit == 0 || digit == 1);
		if (!nodes[o].next[digit]) {
			nodes.push_back(Node());
			nodes[o].next[digit] = nodes.size() - 1;
		}
		o = nodes[o].next[digit];
	}
	nodes[o].isEntry = true;
	nodes[o].nexthop = entry.nexthop;
}

void init(int n, int q, const RoutingTableEntry *a) {
	for (int i = 0; i < n; ++i) {
		insert(a[i]);
	}
}

unsigned query(unsigned addr) {
	addr = toLittleEndian(addr);
	int o = 0;
	unsigned ans = nodes[o].isEntry ? nodes[o].nexthop : 0;
	for (int i = 0; i < 32; ++i) {
		const int digit = !!(addr & (1u << (31 - i)));
		if (!nodes[o].next[digit]) {
			return ans;
		} else {
			o = nodes[o].next[digit];
			if (nodes[o].isEntry) {
				ans = nodes[o].nexthop;
			}
		}
	}
	return ans;
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #19.93 us20 KBRuntime ErrorScore: 0

Testcase #22.193 ms9 MB + 496 KBRuntime ErrorScore: 0

Testcase #32.197 ms9 MB + 496 KBRuntime ErrorScore: 0

Testcase #42.195 ms9 MB + 496 KBRuntime ErrorScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-03-23 00:21:18 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠