#1289 : 403 Forbidden

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

Little Hi runs a web server. Sometimes he has to deny access from a certain set of malicious IP addresses while his friends are still allow to access his server. To do this he writes N rules in the configuration file which look like:

allow 1.2.3.4/30
deny 1.1.1.1
allow 127.0.0.1
allow 123.234.12.23/3
deny 0.0.0.0/0

Each rule is in the form: allow | deny address or allow | deny address/mask.

When there comes a request, the rules are checked in sequence until the first match is found. If no rule is matched the request will be allowed. Rule and request are matched if the request address is the same as the rule address or they share the same first mask digits when both written as 32bit binary number.

For example IP "1.2.3.4" matches rule "allow 1.2.3.4" because the addresses are the same. And IP "128.127.8.125" matches rule "deny 128.127.4.100/20" because 10000000011111110000010001100100 (128.127.4.100 as binary number) shares the first 20 (mask) digits with 10000000011111110000100001111101 (128.127.8.125 as binary number).

Now comes M access requests. Given their IP addresses, your task is to find out which ones are allowed and which ones are denied.

输入

Line 1: two integers N and M.

Line 2-N+1: one rule on each line.

Line N+2-N+M+1: one IP address on each line.

All addresses are IPv4 addresses(0.0.0.0 - 255.255.255.255). 0 <= mask <= 32.

For 40% of the data: 1 <= N, M <= 1000.

For 100% of the data: 1 <= N, M <= 100000.

输出

For each request output "YES" or "NO" according to whether it is allowed.

样例输入
5 5
allow 1.2.3.4/30
deny 1.1.1.1
allow 127.0.0.1
allow 123.234.12.23/3
deny 0.0.0.0/0
1.2.3.4
1.2.3.5
1.1.1.1
100.100.100.100
219.142.53.100
样例输出
YES
YES
NO
YES
NO

题目大意:
给定N个允许接入或者拒绝的IP或者IP/掩码
再给M个IP地址,判断是否可以接入,可以输出YES,否则输出NO(没有匹配的输出YES)
1<=N,M<=100000
(判断的时候要按照N条规则的先后顺序判断的,遇到符合的就输出)
思路:
一开始没看到N和M的最大值,做法是,将N条规则中的IP转换为整数,在按照掩码位数得到掩码(没有掩码的按照掩码位数为32),
并将掩码和掩码位数存储到结构体数组中,对于测试的每一条IP,与结构体数组中的掩码,按照掩码位数进行比较,直到找到第一条
匹配的。 当然这种想法果断超时。

AC思路:
为了节省查询的时间,想到用map存储N条规则,但是map ,在查找是并不是按照N条规则给的顺序给你查找啊,所以在map<pnode,node>
pnode 是一个结构体,存储的是掩码和掩码的位数,node 存储的是顺序和是否允许接入;
当我们判断一个IP是否允许接入时,我们事先并不知道,掩码位数为多少的出现在前面,所以要从0~32位逐一枚举测试IP的掩码位数,查看是否在map
,查看是否在map中出现过,若出现了,比较出现的顺序,取出现较早的

#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <vector>
#include <map>
#define maxn 110
#define inf 0x7fffffff
using namespace std;
struct node
{
int pos;// 序号
int flag;// 拒绝还是接受 1表示接受,0表示拒绝
node()
{ }
node(int x, int y)
{
pos = x;
flag = y;
}
bool operator<(const node& b)
{
return pos < b.pos;
}
};
struct pnode
{
int k;// ip 值
int num; // 子网掩码位数
pnode()
{ }
pnode(int x, int y)
{
k = x;
num = y;
} bool operator<(const pnode& b)const
{
if(k!=b.k) return k < b.k;
else
{
return num < b.num;
}
} };
map<pnode, node>my_map;
int Trans(int x,int y, int z, int w, int num)
{
int ans = 0;
if(num == 0)return ans;
ans = ans|x;
ans<<=8;
ans = ans|y;
ans<<=8;
ans = ans|z;
ans<<=8;
ans = ans|w;
int k = 32 - num;
ans>>=k;
ans<<=k; return ans; } int main()
{ //freopen("data.txt","r",stdin);
int n,m;
char str[maxn];
char c[20];
int x,y,z,w;
while(scanf("%d%d",&n,&m)!=EOF)
{
getchar();
my_map.clear();
for(int j = 0; j < n;j++)
{
gets(str);
int len = strlen(str);
bool f = false;
for(int i = len - 1;i >= 0;i--)
{
if(str[i] == '/')
{
f = true;
break;
}
} int num = 32;
if(f)sscanf(str, "%s %d.%d.%d.%d/%d", c, &x,&y,&z,&w,&num);
else sscanf(str, "%s %d.%d.%d.%d", c, &x,&y,&z,&w); int k = Trans(x,y,z,w,num);
int flag = 0;
pnode tmp_pnode;
tmp_pnode.k = k;
tmp_pnode.num = num;
if(strcmp(c, "allow") == 0)
{
flag = 1;
} if(my_map.find(tmp_pnode) == my_map.end())
{
my_map[tmp_pnode] = node(j,flag);
} } while(m--)
{
scanf("%d.%d.%d.%d",&x,&y,&z,&w);
int pos = inf;
int flag = 1;
for(int i = 0 ; i <= 32;i++)
{
int k = Trans(x,y,z,w,i);
pnode tmp_pnode;
tmp_pnode.k = k;
tmp_pnode.num = i; if(my_map.find(tmp_pnode)!= my_map.end())
{
node a = my_map[tmp_pnode]; if(pos > a.pos)
{
pos = a.pos;
flag = a.flag;
}
}
} if(flag == 1)puts("YES");
else puts("NO");
}
} }

  

hihocoder #1289 : 403 Forbidden (2016 微软编程笔试第二题)的更多相关文章

  1. [Hihocoder 1289] 403 Forbidden (微软2016校园招聘4月在线笔试)

    传送门 #1289 : 403 Forbidden 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi runs a web server. Someti ...

  2. ACM学习历程—Hihocoder 1289 403 Forbidden(字典树 || (离线 && 排序 && 染色))

    http://hihocoder.com/problemset/problem/1289 这题是这次微软笔试的第二题,过的人比第三题少一点,这题一眼看过去就是字符串匹配问题,应该可以使用字典树解决.不 ...

  3. 微软2016校园招聘4月在线笔试 hihocoder 1289 403 Forbidden

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 Little Hi runs a web server. Sometimes he has to deny acces ...

  4. hihocoder #1290 : Demo Day (2016微软编程测试第三题)

    #1290 : Demo Day 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 You work as an intern at a robotics startup. ...

  5. CSDN挑战编程——《金色十月线上编程比赛第二题:解密》

    金色十月线上编程比赛第二题:解密 题目详情: 小强是一名学生, 同一时候他也是一个黑客. 考试结束后不久.他吃惊的发现自己的高等数学科目竟然挂了,于是他果断入侵了学校教务部站点. 在入侵的过程中.他发 ...

  6. 【微软2017年预科生计划在线编程笔试第二场 B】Diligent Robots

    [题目链接]:http://hihocoder.com/problemset/problem/1498 [题意] 一开始你有1个机器人; 你有n个工作; 每个工作都需要一个机器人花1小时完成; 然后每 ...

  7. 【微软2017年预科生计划在线编程笔试第二场 A】Queen Attack

    [题目链接]:http://hihocoder.com/problemset/problem/1497 [题意] 给你n个皇后; 然后问你其中能够互相攻击到的皇后的对数; 皇后的攻击可以穿透; [题解 ...

  8. Queen Attack -- 微软2017年预科生计划在线编程笔试第二场

    #!/usr/bin/env python # coding:utf-8 # Queen Attack # https://hihocoder.com/problemset/problem/1497 ...

  9. Parentheses Sequence微软编程笔试

    描述 You are given a sequence S of parentheses. You are asked to insert into S as few parentheses as p ...

随机推荐

  1. 10_HTTP协议_入门知识

    [什么是HTTP协议] 对 浏览器客户端 和  服务器端之间的数据传输的格式规范. 客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵循一定的通讯格式,HTTP协议用于定义客户端与 ...

  2. 2016/7/6 神·CPU的人类极限在哪?

    额,这其实是个搞怪贴 #include<stdio.h>int main(void){ int i,k; for(i=0;;i++) { k=i+222222222; printf(&qu ...

  3. PHP学习心得(三)——处理表单

    表单的任何元素都在 PHP 脚本中自动生效. 一个简单的 HTML 表单: <form action="action.php" method="post" ...

  4. PHP学习笔记(5) - 选择一个合格的框架

    作为一个合格的PHP开发框架,个人觉得起码需要满足以下几点. 一.上梁不正下梁歪,好的框架首先自身要有良好的编码规范和文件目录结构,代码要易于阅读理解. 二.为了可以更好地适应OOP,框架必须可以提供 ...

  5. j2ee中如何拦截jsp页面?

    加filter: public class RightFilter implements Filter { public void init(FilterConfig filterConfig) th ...

  6. 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割

    1001: [BeiJing2006]狼抓兔子 Description 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下 三种类型的道路 1:(x,y)<==>( ...

  7. poj 2187 Beauty Contest

    Beauty Contest 题意:给你一个数据范围在2~5e4范围内的横纵坐标在-1e4~1e4的点,问你任意两点之间的距离的最大值的平方等于多少? 一道卡壳凸包的模板题,也是第一次写计算几何的题, ...

  8. Unity3d Shader开发(三)Pass(Pass Tags,Name,BindChannels )

    Pass Tags 通过使用tags来告诉渲染引擎在什么时候该如何渲染他们所期望的效果. Syntax 语法 Tags { "TagName1" = "Value1&qu ...

  9. 一步步学习ASP.NET MVC3 (3)——Razor(1)

    请注明转载地址:http://www.cnblogs.com/arhat 首先这个<一步步学习ASP.NET MVC3>前段时间有些忙,没有顾得上写文章,昨天呢写了3个和ASP.NET的相 ...

  10. Java 中正确使用 hashCode 和 equals 方法

    在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hash ...