1. 程式人生 > >poj2799 IP Networks

poj2799 IP Networks

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;
}