题目: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;
}