样例输入
2
1
2
样例输出
1.0.0.0/8
2.0.0.0/8
样例输入
2
10/9
10.128/9
样例输出
10.0.0.0/8
样例输入
2
0/1
128/1
样例输出
0.0.0.0/0
分析
交上去就90分,太恶心以后再补吧
代码
#include<bits/stdc++.h>
using namespace std;
set<long long> ips,ans;
void print(long long ip)
{
int res[5]={0};
for(int i=0;i<5;i++)
{
res[i]=ip&255;
ip>>=8;
}
printf("%d.%d.%d.%d/%d\n",res[4],res[3],res[2],res[1],res[0]);
}
void input()
{
char ch;
long long ip=0,tmp=0,len=8,k=1;
while(true)
{
cin>>tmp;
ip+=(tmp<<32-len);
ch=getchar();
if(ch=='.') len+=8;
if(ch=='/')
{
cin>>len;
ch=getchar();
}
if(ch=='\n')
{
ip<<=8;
ip+=len;
break;
}
}
k<<=40-len;
if(ips.count(k^ip)) ips.insert((ip|k^ip)-k-1);
else ips.insert(ip);
}
void solve()
{
int perl;
long long perip;
for(set<long long>::iterator it=ips.begin();it!=ips.end();it++)
{
int l=(*it)&255;
long long ip=(*it)>>8;
if(it!=ips.begin())
{
if(ip>>32-perl==perip>>32-perl) continue;
ans.insert(*it);
perl=l; perip=ip;
}
else { ans.insert(*it);perl=l; perip=ip; }
}
}
int main()
{
int n;
cin>>n;
getchar();
while(n--) input();
solve();
for(set<long long>::iterator it=ans.begin();it!=ans.end();it++)
print(*it);
return 0;
}
题解汇总
CCF-CSP认证历年题解