提交记录 14179


用户 题目 状态 得分 用时 内存 语言 代码长度
chrogeek router32. 测测你的路由器 Accepted 100 292.011 ms 71508 KB C++ 1.31 KB
提交时间 评测时间
2020-09-17 09:50:59 2020-09-17 09:51:05
#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 = {Node()};

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 #113.49 us28 KBAcceptedScore: 25

Testcase #258.622 ms69 MB + 852 KBAcceptedScore: 25

Testcase #3175.885 ms69 MB + 852 KBAcceptedScore: 25

Testcase #4292.011 ms69 MB + 852 KBAcceptedScore: 25


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