CCF 2018-12-3 CIDR合并 100分

试题编号: 201812-3
试题名称: CIDR合并
时间限制: 1.0s
内存限制: 512.0MB
问题描述:

CCF 2018-12-3 CIDR合并 100分_第1张图片

CCF 2018-12-3 CIDR合并 100分_第2张图片

CCF 2018-12-3 CIDR合并 100分_第3张图片

CCF 2018-12-3 CIDR合并 100分_第4张图片

CCF 2018-12-3 CIDR合并 100分_第5张图片

 

#include
#include
#include
using namespace std;

typedef struct Node{
	int len;//len要写在long long的前面,有没有大佬帮忙解释一下,为什么在long long后面定义int会出错
	int ip[4];//ip 0,1,2,3 表示IP的1,2,3,4段
	long long val;//IP的十进制数 
}Node;
 
int getNum(string s){//字符串转化为数字 
    int sum=0;
    for(int i=0;i=s.size())break;
		if(s[i]=='/')break;
		if(s[i]=='.')dotNum++;
		i++;
	}
	string ip;int len;
	ip=s.substr(0,i);
	if(dotNum==0){
		ip+=".0.0.0";
	}else if(dotNum==1){
		ip+=".0.0";
	}else if(dotNum==2){
		ip+=".0";
	}
	if(i>=s.size()){
		if(dotNum==0)len=8;
		else if(dotNum==1)len=16;
		else if(dotNum==2)len=24;
		else len=32;
	}else len=getNum(s.substr(i+1,s.size()-i-1));
	Node temp;int a=0,b=0,c=3,x,t=0;
	temp.len=len;
	while(b>(32-first.len))==second.val>>(32-first.len))){
			node[++p]=node[i];//注意消除算法,其中这次消除占大部分时间,消除算法很重要 
		}
	}
	n=p+1;
}

int deal_del_2(){//第二次消除 ,所占时间较少,可采用循环中退步的消除方式 
	for(int i=0;i>(32-first.len+1)<<(32-first.len+1)==first.val){//检查是否为合法的IP前缀 
			    if(first.val!=second.val && first.val>>(32-first.len+1)<<(32-first.len+1)==second.val>>(32-first.len+1)<<(32-first.len+1)){
				    int j=i+1;
			        while(j>n;
	for(int i=0;i>s;
		deal_input(i,s);
	}
	sort(node,node+n,cmp);
	deal_del_1();
	deal_del_2();
	for(int i=0;i

更多相关CCF的试题解答,请点击>>CCF历年认证考试解答

你可能感兴趣的:(CCF 2018-12-3 CIDR合并 100分)