IP Filtering hoj 二分好题!!

来源:互联网 发布:化妆品推荐 知乎 编辑:程序博客网 时间:2024/05/21 09:59

/*用位运算将ip转化成数字。对左端点进行排序。然后将区间合并。如果二分的值在左边界左边,则向上一个区间查询,若果在中间,则返回true,否则,向下一个区间找。最后一个很蛋疼的地方就是high=n-1而不是n,数组的下标越界。这个地方wa到吐血啊。*///<<左移n,相当于乘以2的n次方,>>为除#include <stdio.h>#include <iostream>#include <algorithm>using namespace std;struct IP{    long long  a,b;} ip[1000010];long long m;char p[30];char q[30];bool cmp (struct IP x, struct IP y){    if(x.a != y.a)        return x.a < y.a;    }long long cal(char s[]){    int c1,c2,c3,c4;    sscanf(s,"%d.%d.%d.%d",&c1,&c2,&c3,&c4);    return ((c1<<24)+(c2<<16)+(c3<<8)+c4);}bool erfen(int n,long long m){    int low=0,high=n-1,mid=0;    while(low<=high)    {        mid=(high+low)/2;        if(m<=ip[mid].b&&m>=ip[mid].a)        {            return true;            break;        }        else if(m>ip[mid].b)            low=mid+1;        else            high=mid-1;    }    return false;}int main(){    int n=0;    while(scanf("%s",p)==1)    {        if(p[0]=='#') break;        scanf("%s",q);        ip[n].a=cal(p);        ip[n].b=cal(q);        long long w;        if(ip[n].a>ip[n].b)        {            w=ip[n].a;            ip[n].a=ip[n].b;            ip[n].b=w;        }         n++;    }    sort(ip,ip+n,cmp);    char r[30];    while(scanf("%s",r)==1)    {        long long m=cal(r);        if(erfen(n,m)) printf("yes\n");        else printf("no\n");    }    return 0;} 


原创粉丝点击