Hoj 2278 IP Filtering

题目:http://acm.hit.edu.cn/hoj/problem/view?id=2278

水题。判断一个IP是否在某个IP段内。

将IP转换成数字,用二分法查找即可。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <string>
using namespace std;


struct IP
{
    long long start;
    long long end;
};

long long count(char *str)
{
    int b[4];
    sscanf(str,"%d.%d.%d.%d",b,b+1,b+2,b+3);
    long long a;
    a = b[0]*1e9+b[1]*1e6+b[2]*1e3+b[3];
    //printf("a = %lld\n",a);
    return a;
}
IP ip[1000005];

bool cmp(IP a,IP b)
{
    return a.start<b.start;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    char str[30];
    int n = 0;
    while(scanf("%s",str)!=EOF)
    {
        if(str[0] == '#')
        {
            break;
        }
        ip[n].start = count(str);
        scanf("%s",str);
        ip[n].end = count(str);
        if(ip[n].start> ip[n].end)
        {
            long long swp;
            swp = ip[n].end;
            ip[n].end=ip[n].start;
            ip[n].start = swp;
        }
        n++;
    }
    sort(ip,ip+n,cmp);

    while(scanf(" %s",str)!=EOF)
    {
        long long temp = count(str);
        int low = 0;
        int high = n-1;

        int flag = false;

        while(low<=high)
        {
            int mid = (low + high)/2;
            if(temp>=ip[mid].start && temp<=ip[mid].end)
            {
                flag = true;
                break;
            }
            else if(temp<ip[mid].start)
            {
                high = mid - 1;
            }
            else
            {
                low = mid + 1;
            }

        }
        if(flag == true) printf("yes\n");
        else printf("no\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值