IP Filtering hoj 二分好题!!
2012-07-24 21:56
423 查看
/*用位运算将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 .a=cal(p); ip .b=cal(q); long long w; if(ip .a>ip .b) { w=ip .a; ip .a=ip .b; ip .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; }
相关文章推荐
- [hoj 2278]IP Filtering[二分+区间合并]
- HOJ 2278 IP Filtering (二分)
- Hoj 2278 IP Filtering
- 基础算法(二分,贪心):NOIP 2012 疫情控制
- 【hoj】2160 bin packing 二分、贪心
- 【hoj】2160 bin packing 二分、贪心
- HOJ 13006 Minimal Subarray Length (单调队列或RMQ加二分)
- Filtering IP Packets on Router Interfaces with Extended Access Lists
- hoj 2651 Pie(二分)hoj 2278 (二分)
- Spark查找某个IP的归属地,二分算法,try{}catch{}的使用,将结果存MySQL数据库
- EOP / Office 365: Block or Allow IP Address in Connection Filtering
- [hoj]Pie【二分】
- 【hoj】2651 pie 二分查找
- HOJ 2206 IP的计算
- IP filtering terms and expressions (iptables)
- HOJ 2615 Pie ---------------二分查找的运用
- Spark中ip映射数据应用库,二分查找省份,将结果写入mysql
- HOJ 2608 Assemble(二分)
- Cable Master 实数的二分 hoj
- 【hoj】2651 pie 二分查找