提交记录 14203


用户 题目 状态 得分 用时 内存 语言 代码长度
soulhammer router32. 测测你的路由器 Wrong Answer 25 10.208 ms 9716 KB C++ 2.09 KB
提交时间 评测时间
2020-09-18 14:04:12 2020-09-18 14:04:19
#include "router.h"
#include <arpa/inet.h>

void copyEntry(RoutingTableEntry * entry, RoutingTableEntry oldEntry) {
  entry -> addr = oldEntry.addr;
  entry -> len = oldEntry.len;
  entry -> pad[0] = oldEntry.pad[0];
  entry -> pad[1] = oldEntry.pad[1];
  entry -> pad[2] = oldEntry.pad[2];
  entry -> nexthop = oldEntry.nexthop;
}

struct Node {
  RoutingTableEntry * entry = nullptr;
  Node * parent = nullptr;
  Node * lNode = nullptr, * rNode = nullptr;
};

class RoutingTrie {
  static Node * root;
public:
  static RoutingTableEntry * search(unsigned addr) {
    addr = ntohl(addr);
    Node * node = root;
    RoutingTableEntry * entry = nullptr;
    for (int i = 0; i < 32; i ++) {
      int bit = addr >> 31;
      node = (bit == 0) ? node -> lNode : node -> rNode;
      if (node != nullptr) {
        entry = (node -> entry == nullptr) ? entry : node -> entry; 
      } else {
        break;
      }
      addr = addr << 1;
    }
    return entry;
  }

  static void insertNode(RoutingTableEntry entry) {
    unsigned addr = ntohl(entry.addr);
    int len = entry.len - '0';
    Node * node = root;
    for (int i = 0; i < len; i ++) {
      int bit = addr >> 31;
      if (bit == 0) {
        if (node -> lNode == nullptr) {
          node -> lNode = new Node;
          node -> lNode -> parent = node;
        }
        node = node -> lNode;
      } else {
        if (node -> rNode == nullptr) {
          node -> rNode = new Node;
          node -> rNode -> parent = node;
        }
        node = node -> rNode;
      }
      addr = addr << 1;
    }
    if (node -> entry != nullptr) {
      if (node -> entry -> addr == entry.addr) {
        copyEntry(node -> entry, entry);
      }
    } else {
      node -> entry = new RoutingTableEntry;
      copyEntry(node -> entry, entry);
    }
  }
};

Node * RoutingTrie::root = new Node;

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

unsigned query(unsigned addr) {
  RoutingTableEntry * entry = RoutingTrie::search(addr);
  if (entry != nullptr) {
    return entry -> nexthop;
  }
  return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #111.79 us24 KBAcceptedScore: 25

Testcase #23.541 ms9 MB + 500 KBWrong AnswerScore: 0

Testcase #36.873 ms9 MB + 500 KBWrong AnswerScore: 0

Testcase #410.208 ms9 MB + 500 KBWrong AnswerScore: 0


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