poj2799 IP Networks
阿新 • • 發佈:2019-02-07
IP和DNS都是由32位組成的,每8位決定一個數字0-255,IP地址的數量為2^n,n為IP的二進位制後n位,前32-n對於一個網路裡的ip都是一樣的,DNS直接決定了一個網路裡的ip的數量(前32-n位為1,後n位為0)。
有這些知識儲備以後,得出最長的公共串即可,只需對二進位制數最大和最小的IP進行異或運算,然後統計前面有多少個0,最後把32位轉化4個數字即可。
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int num[3005]; int ip[4],mask[4]; void dealip(int pos){ int tmp; tmp=0; for(int i=pos;i<32;i++){ tmp+=num[0]&(1<<i); } for(int i=0;i<4;i++){ for(int j=0;j<8;j++){ if(tmp&(1<<(j+i*8))){ ip[3-i]+=1<<j; } } } } void dealmask(int pos){ int tmp=0; for(int i=pos;i<32;i++){ tmp+=1<<i; } for(int i=0;i<4;i++){ for(int j=0;j<8;j++){ if(tmp&(1<<(i*8+j))){ mask[3-i]+=1<<j; } } } } int main() { int n,a,b,c,d,tmp; int ans=0,cnt=0,pos; while(~scanf("%d",&n)){ ans=0; cnt=0; memset(ip,0,sizeof(ip)); memset(mask,0,sizeof(mask)); memset(num,0,sizeof(num)); for(int i=0;i<n;i++){ scanf("%d.%d.%d.%d",&a,&b,&c,&d); num[i]=(a<<24)|(b<<16)|(c<<8)|d; } sort(num,num+n); ans=num[0]^num[n-1]; for(int i=31;i>=0;i--){ tmp=1<<i; if(!(ans&tmp)) cnt++; else break; } pos=32-cnt; dealip(pos); dealmask(pos); for(int i=0;i<4;i++){ printf("%d",ip[i]); if(i==3) printf("\n"); else printf("."); } for(int i=0;i<4;i++){ printf("%d",mask[i]); if(i==3) printf("\n"); else printf("."); } } return 0; }