提交记录 14701


用户 题目 状态 得分 用时 内存 语言 代码长度
test router32. 测测你的路由器 Wrong Answer 25 836.273 ms 74028 KB C++ 2.02 KB
提交时间 评测时间
2020-11-02 00:33:25 2020-11-02 00:33:29
#include "router.h"
#include <arpa/inet.h>
#include <list>
#include <iostream>
using namespace std;

struct node{
  list<RoutingTableEntry> children[65537];
  node(){}
};

node nodes[16]; //17-32./checksum < data/checksum_input1.pcap
list<RoutingTableEntry> small[65547]; //1-16

void init(int n, int q, const RoutingTableEntry *a) {
	for(int i=0;i<n;i++){
		unsigned addr = ntohl(a[i].addr);
		int len = a[i].len;
		if(len<17){
	      int index = (addr >> (32-len));
	      for(list<RoutingTableEntry>::iterator it = small[index].begin();it!=small[index].end();++it){
	          if((*it).len == len){
	              small[index].erase(it);
	              break;
	          }
	      }
	      small[index].push_back(a[i]);
	    }
	    else{
	      int index = addr >> 16;
	      int r = (addr & 0xffff) >> (32 -len);
	      for(list<RoutingTableEntry>::iterator it = nodes[len-17].children[index].begin();it!=nodes[len-17].children[index].end();++it){
	          int taddr = (*it).addr;
	          if(((taddr & 0xffff) >> (32-len)) == r){
	              nodes[len-17].children[index].erase(it);
	              break;
	          }
	      }
	      nodes[len-17].children[index].push_back(a[i]);
	    }
	} 
}

unsigned query(unsigned addr) {
  int o_addr = addr;
  addr = ntohl(addr);
  int prefix = addr >> 16;
  int suffix = addr & 0xffff;
  for(int i=32;i>16;i--){
    int r = suffix >> (32 - i);
    //printf("%x\n",r);
    for(list<RoutingTableEntry>::iterator it = nodes[i-17].children[prefix].begin(); it != nodes[i-17].children[prefix].end();it++){
      //printf("%x\n",(*it).addr);
      int taddr = ntohl((*it).addr);
      if(((taddr & 0xffff) >> (32 - i)) == r){
        return (*it).nexthop;
      }
    }
  }
  int r = 0;
  for(int i=16;i>=1;i--){
    if(r==0)
      r = addr >> (32 - i);
    else if( r == (addr >> (32 - i)))
      continue;
    r = addr >> (32 - i);
    for(list<RoutingTableEntry>::iterator it = small[r].begin();it!=small[r].end();it++){
      if((*it).len == i)
      {
        return (*it).nexthop;
      }
    }
    
  }
  return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #14.65 ms25 MB + 548 KBAcceptedScore: 25

Testcase #270.137 ms72 MB + 300 KBWrong AnswerScore: 0

Testcase #3452.648 ms72 MB + 300 KBWrong AnswerScore: 0

Testcase #4836.273 ms72 MB + 300 KBWrong AnswerScore: 0


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