1000: 恶意IP 课程作业
1000: 恶意IP
Time Limit: 1 Sec Memory Limit: 16 MB
Description
Water同学最近好不容易学会了用Tornado建起一个个人的Website,并且成功上线了。
来访用户逐渐增多,但Water发现总有些恶意用户很喜欢刷屏,总是回复些评论如“楼主不要放弃治疗!”,“楼主药不能停!”之类的。Water感受到了这个世界满满的恶意,他很不爽,决定将这部分恶意用户过滤掉。
他已经掌握到这些用户的IP了,但是过滤IP这件事情对于数据结构挂了的他来说实在是有些困难,所以他来找你帮忙了!
IP格式为 a.b.c.d , 其中 a,b,c,d均为[0,255]之间的整数。
Input
只有一组数据。第一行为一个整数N [0, 1 000 000],代表恶意IP列表的长度。接下来N行是N个恶意IP。
然后紧随一个整数M [0, 1 000 000],代表访问IP的长度。接下来M行是M个来访IP。
你需要判断该来访IP是否在恶意IP列表中。
Output
如果来访IP是恶意IP,则输出 FILTER,否则输出 PASS。
Sample Input
5
233.233.233.233
250.250.250.250
10.20.30.40
123.255.123.255
172.18.182.69
6
10.123.128.245
233.233.233.233
172.18.182.253
102.30.40.50
172.18.182.96
172.18.182.69
Sample Output
PASS
FILTER
PASS
PASS
PASS
FILTER 这是我们数据结构的一道题,这道题本来不难,只要时间内存足够一个map就可以了,关键是时间要求1s内存是16MB,并且坑的是,测试数据量1 000 000组。那么这就要讲究策略了。首先不能用c++的STL和输入输出流还有string吧。。这些都是很耗空间和时间的。要效率就得选择C语言了。
然后是搜索问题,我们要根据字符串来搜索。在这里不管是快排还是归并都是达不到要求的,因为数据量太大。那么要选择什么呢?肯定哈希啦。。
所以下面就是怎么构造哈希表的问题了。因为键值是字符串不能当数组的下标,而且建数组的话也要注意大小问题。我选择的是BKDRHash函数,因为这个函数还是比较常用的。函数如下:
unsigned int BKDRHash(char *str)
{
unsigned int seed = ; // 31 131 1313 13131 131313 etc..
unsigned int hash = ; while (*str)
{
hash = hash * seed + (*str++);
} return (hash & 0x7FFFFFFF);
}
这里因为数据量最大是 1 000 000, 那么我们就构建一个 1 000 000 大小的数组吧。然后因为当字符串长的时候 BKDRHash()函数的返回值其实是很大的,所以返回值要对 1 000 000取余。
还有一个要注意的问题是冲突问题,一般情况下我一般用拉链法。。所以就拉链了。。。
下面是我的代码实现,因为写得比较急有点挫。。。
#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; unsigned int BKDRHash(char *str) {
unsigned int seed = ;
unsigned int hash = ; while (*str) {
hash = hash * seed + (*str++);
} return (hash & 0x7FFFFFFF);
} struct Node {
char* value;
Node* next;
//value is link to a list which has conflict elements
Node(char* value_ = NULL){
value = value_;
next = NULL;
}
}; Node **arr = new Node*[]; void initializeHash(int N) {
//we can't only use a char[] here because the
//address of str will not change in this way,
//and the elements will be the same because
//they are just the same element
char* str;
for (int i = ; i != N; i++) {
str = new char[];
scanf("%s", str);
unsigned int temp = BKDRHash(str);
temp %= ; if (arr[temp] == NULL) {
arr[temp] = new Node(str);
} else {
Node* root = arr[temp];
while (root->next != NULL) {
root = root->next;
}
root->next = new Node(str);
}
}
} void judgeIp(char* str) {
unsigned int temp = BKDRHash(str);
temp %= ;
if (arr[temp] == NULL) {
printf("PASS\n");
} else {
bool flag = true;
Node* root = arr[temp];
while (root != NULL) {
if (strcmp((root->value), str) == ) {
flag = false;
printf("FILTER\n");
break;
}
root = root->next;
}
if (flag)
printf("PASS\n");
}
}
int main(int argc, char const *argv[])
{
int N;
scanf("%d", &N);
for (int i = ; i != ; i++)
arr[i] = NULL;
initializeHash(N); char str[];
scanf("%d", &N);
for (int i = ; i != N; i++) {
scanf("%s", str);
judgeIp(str);
}
return ;
}
1000: 恶意IP 课程作业的更多相关文章
- 恶意IP远程登录Linux服务器脚本
#!/bin/sh #auto drop ssh failed IP address #定义变量 SEC_FILE=/var/log/secure #如下为截取secure文件恶意ip 远程登录22端 ...
- iptables+ipset自动封闭和解封频繁访问web服务的恶意IP
转载于互联网 iptables直接针对ip进行封禁,在ip数量不大的时候是没什么问题的,但当有大量ip的时候性能会严重下降,iptables是O(N)的性能.而ipset就像一个集合,把需要封 ...
- Web编程基础--HTML、CSS、JavaScript 学习之课程作业“仿360极速浏览器新标签页”
Web编程基础--HTML.CSS.JavaScript 学习之课程作业"仿360极速浏览器新标签页" 背景: 作为一个中专网站建设出身,之前总是做静态的HTML+CSS+DIV没 ...
- 自动拒绝恶意IP远程登录Linux服务器脚本
当我们已经配置了iptables防火墙,我们允许22端口对外网所有人访问,当然这也是为了方便,我们在任何地方都连接上,没有做VPN,也没有做ssh密钥验证,但是我们的密码设置得非常复杂,大小写.特殊符 ...
- 课程作业01:模仿JavaAppArguments.java示例,编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。
1.设计思想: 首先是从JavaAppArguments.java示例开始,此示例已打印参数,定义数字 之和和作为存储单位的整型,然后将输入参数的字符串转化为整型,之后求和即可. 2.程序流程图: 3 ...
- coursea机器学习课程作业
coursea机器学习课程作业 一 关于此课程 课程地址 图片来自网络 1.官网课程地址传送 2.如果访问官网速度较慢可以上 B站课程地址 机器学习是一门研究在非特定编程条件下让计算机采取行动的学科. ...
- THE LAST ONE!! 2017《面向对象程序设计》课程作业八
THE LAST ONE!! 2017<面向对象程序设计>课程作业八 031602230 卢恺翔 GitHub传送门 题目描述 1.时间匆匆,本学期的博客作业就要结束了,是否有点不舍,是否 ...
- 发现恶意ip大量访问 可使用命令进行封禁
1. vim /etc/sysconfig/iptables 2.添加箭头指向的语句,ip可以替换, 3. 保存后退出 service iptables save 4.重启 service iptab ...
- nginx限制恶意IP处理方法
思考了几种方案,最终考虑使用ip黑名单的方式: 处理方法: 一.nginx黑名单方式: 1.过滤日志访问API接口的IP,统计每10分钟调用超过100次的IP,直接丢进nginx的访问黑名单 2.具体 ...
随机推荐
- Windows7上安装Git
我首先是百度到了这个网站:https://git-scm.com/download/win 这个网站上有下载链接,你可以根据你的系统选择不同的下载链接,我的是Win7 x64位的,下载地址为: htt ...
- 【刷题】洛谷 P2764 最小路径覆盖问题
题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开 ...
- javascript push 和 concat 的区别
array.push(item1,item2,item3...) array.concat(item1,item2,item3...) 1. push和concat的元素都既可以是普通元素(任意类型) ...
- [PKUWC2018]随机算法
题意:https://loj.ac/problem/2540 给定一个图(n<=20),定义一个求最大独立集的随机化算法 产生一个排列,依次加入,能加入就加入 求得到最大独立集的概率 loj25 ...
- Update SSM agent to each EC2 via Bat and bash script
1. copy the instance id from aws console to file 2. remove the , from file sed -i 's/,//g' file 3. g ...
- asp:DropDownList与asp:DataList的联合使用
情况:当在asp:DropDownLis点击选取其中的一个值来响应datalist的值. <form id="form1" runat="server"& ...
- java mysql 连接
第一种: //驱动程序名 String driver = "com.mysql.jdbc.Driver"; //URL指向要访问的数据库名mydata String url = & ...
- 51Nod 1091 线段重叠 | 贪心
Input示例 5 1 5 2 4 2 8 3 7 7 9 Output示例 4 first try: O(n^2):二层循环,减法取最大 后五个time limit exceeded #includ ...
- Item 11 谨慎地覆盖Clone
1.进行浅拷贝时,只是复制原始数据类型的值,则可以通过覆盖Clone方法来达到.另外,在进行浅拷贝的时候,还要注意,成员对象中不应该要有引用类型,如果有引用类型,那么,进行了浅拷贝之后,两个对象将会共 ...
- 【51NOD-0】1008 N的阶乘 mod P
[算法]简单数学 [题解]多项式展开:(a*b)%p=(a%p*b%p)%p #include<cstdio> #include<algorithm> #define rep( ...