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

  1. 5
  2. 233.233.233.233
  3. 250.250.250.250
  4. 10.20.30.40
  5. 123.255.123.255
  6. 172.18.182.69
  7. 6
  8. 10.123.128.245
  9. 233.233.233.233
  10. 172.18.182.253
  11. 102.30.40.50
  12. 172.18.182.96
  13. 172.18.182.69

Sample Output

  1. PASS
  2. FILTER
  3. PASS
  4. PASS
  5. PASS
  6. FILTER
  7.  
  8. 这是我们数据结构的一道题,这道题本来不难,只要时间内存足够一个map就可以了,关键是时间要求1s内存是16MB,并且坑的是,测试数据量1 000 000组。那么这就要讲究策略了。首先不能用c++的STL和输入输出流还有string吧。。这些都是很耗空间和时间的。要效率就得选择C语言了。
    然后是搜索问题,我们要根据字符串来搜索。在这里不管是快排还是归并都是达不到要求的,因为数据量太大。那么要选择什么呢?肯定哈希啦。。
    所以下面就是怎么构造哈希表的问题了。因为键值是字符串不能当数组的下标,而且建数组的话也要注意大小问题。我选择的是BKDRHash函数,因为这个函数还是比较常用的。函数如下:
  1. unsigned int BKDRHash(char *str)
  2. {
  3. unsigned int seed = ; // 31 131 1313 13131 131313 etc..
  4. unsigned int hash = ;
  5.  
  6. while (*str)
  7. {
  8. hash = hash * seed + (*str++);
  9. }
  10.  
  11. return (hash & 0x7FFFFFFF);
  12. }

这里因为数据量最大是 1 000 000, 那么我们就构建一个 1 000 000 大小的数组吧。然后因为当字符串长的时候 BKDRHash()函数的返回值其实是很大的,所以返回值要对 1 000 000取余。

还有一个要注意的问题是冲突问题,一般情况下我一般用拉链法。。所以就拉链了。。。

下面是我的代码实现,因为写得比较急有点挫。。。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. unsigned int BKDRHash(char *str) {
  8. unsigned int seed = ;
  9. unsigned int hash = ;
  10.  
  11. while (*str) {
  12. hash = hash * seed + (*str++);
  13. }
  14.  
  15. return (hash & 0x7FFFFFFF);
  16. }
  17.  
  18. struct Node {
  19. char* value;
  20. Node* next;
  21. //value is link to a list which has conflict elements
  22. Node(char* value_ = NULL){
  23. value = value_;
  24. next = NULL;
  25. }
  26. };
  27.  
  28. Node **arr = new Node*[];
  29.  
  30. void initializeHash(int N) {
  31. //we can't only use a char[] here because the
  32. //address of str will not change in this way,
  33. //and the elements will be the same because
  34. //they are just the same element
  35. char* str;
  36. for (int i = ; i != N; i++) {
  37. str = new char[];
  38. scanf("%s", str);
  39. unsigned int temp = BKDRHash(str);
  40. temp %= ;
  41.  
  42. if (arr[temp] == NULL) {
  43. arr[temp] = new Node(str);
  44. } else {
  45. Node* root = arr[temp];
  46. while (root->next != NULL) {
  47. root = root->next;
  48. }
  49. root->next = new Node(str);
  50. }
  51. }
  52. }
  53.  
  54. void judgeIp(char* str) {
  55. unsigned int temp = BKDRHash(str);
  56. temp %= ;
  57. if (arr[temp] == NULL) {
  58. printf("PASS\n");
  59. } else {
  60. bool flag = true;
  61. Node* root = arr[temp];
  62. while (root != NULL) {
  63. if (strcmp((root->value), str) == ) {
  64. flag = false;
  65. printf("FILTER\n");
  66. break;
  67. }
  68. root = root->next;
  69. }
  70. if (flag)
  71. printf("PASS\n");
  72. }
  73. }
  74. int main(int argc, char const *argv[])
  75. {
  76. int N;
  77. scanf("%d", &N);
  78. for (int i = ; i != ; i++)
  79. arr[i] = NULL;
  80. initializeHash(N);
  81.  
  82. char str[];
  83. scanf("%d", &N);
  84. for (int i = ; i != N; i++) {
  85. scanf("%s", str);
  86. judgeIp(str);
  87. }
  88. return ;
  89. }
  1.  

1000: 恶意IP 课程作业的更多相关文章

  1. 恶意IP远程登录Linux服务器脚本

    #!/bin/sh #auto drop ssh failed IP address #定义变量 SEC_FILE=/var/log/secure #如下为截取secure文件恶意ip 远程登录22端 ...

  2. iptables+ipset自动封闭和解封频繁访问web服务的恶意IP

    转载于互联网     iptables直接针对ip进行封禁,在ip数量不大的时候是没什么问题的,但当有大量ip的时候性能会严重下降,iptables是O(N)的性能.而ipset就像一个集合,把需要封 ...

  3. Web编程基础--HTML、CSS、JavaScript 学习之课程作业“仿360极速浏览器新标签页”

    Web编程基础--HTML.CSS.JavaScript 学习之课程作业"仿360极速浏览器新标签页" 背景: 作为一个中专网站建设出身,之前总是做静态的HTML+CSS+DIV没 ...

  4. 自动拒绝恶意IP远程登录Linux服务器脚本

    当我们已经配置了iptables防火墙,我们允许22端口对外网所有人访问,当然这也是为了方便,我们在任何地方都连接上,没有做VPN,也没有做ssh密钥验证,但是我们的密码设置得非常复杂,大小写.特殊符 ...

  5. 课程作业01:模仿JavaAppArguments.java示例,编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。

    1.设计思想: 首先是从JavaAppArguments.java示例开始,此示例已打印参数,定义数字 之和和作为存储单位的整型,然后将输入参数的字符串转化为整型,之后求和即可. 2.程序流程图: 3 ...

  6. coursea机器学习课程作业

    coursea机器学习课程作业 一 关于此课程 课程地址 图片来自网络 1.官网课程地址传送 2.如果访问官网速度较慢可以上 B站课程地址 机器学习是一门研究在非特定编程条件下让计算机采取行动的学科. ...

  7. THE LAST ONE!! 2017《面向对象程序设计》课程作业八

    THE LAST ONE!! 2017<面向对象程序设计>课程作业八 031602230 卢恺翔 GitHub传送门 题目描述 1.时间匆匆,本学期的博客作业就要结束了,是否有点不舍,是否 ...

  8. 发现恶意ip大量访问 可使用命令进行封禁

    1. vim /etc/sysconfig/iptables 2.添加箭头指向的语句,ip可以替换, 3. 保存后退出 service iptables save 4.重启 service iptab ...

  9. nginx限制恶意IP处理方法

    思考了几种方案,最终考虑使用ip黑名单的方式: 处理方法: 一.nginx黑名单方式: 1.过滤日志访问API接口的IP,统计每10分钟调用超过100次的IP,直接丢进nginx的访问黑名单 2.具体 ...

随机推荐

  1. 2016 China Final E - Bet

    /************************************************************************* > File Name: E.cpp > ...

  2. [Leetcode] search for a range 寻找范围

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  3. 【Codeforces 506E】Mr.Kitayuta’s Gift&&【BZOJ 4214】黄昏下的礼物 dp转有限状态自动机+矩阵乘法优化

    神题……胡乱讲述一下思维过程……首先,读懂题.然后,转化问题为构造一个长度为|T|+n的字符串,使其内含有T这个子序列.之后,想到一个简单的dp.由于是回文串,我们就增量构造半个回文串,设f(i,j, ...

  4. HDU1281: 棋盘游戏(二分图匹配)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. mysql 常用总结

    centos7 安装mysql 数据库安装参考:http://www.cnblogs.com/longrui/p/6071581.htmlhttps://www.cnblogs.com/yoursou ...

  6. TP-LINK TL-WN725N V2 / rtl8188eu Linux驱动安装

    https://github.com/lwfinger/rtl8188eu 驱动下载地址 安装: make all make install 参考一下把 http://devillived.net/f ...

  7. [Coding Practice] Maximum number of zeros in NxN matrix

    Question: Input is a NxN matrix which contains only 0′s and 1′s. The condition is no 1 will occur in ...

  8. CSS3知识之折角效果

    CSS3折角效果:可兼容不同背景

  9. .net 跨域 问题解决

    参考地址:http://www.cnblogs.com/moretry/p/4154479.html 在项目上面使用 Nuget 搜索 microsoft.aspnet.webapi.cors 直接下 ...

  10. ZOJ 3556 How Many Sets I

    How Many Sets I Time Limit: 2 Seconds      Memory Limit: 65536 KB Give a set S, |S| = n, then how ma ...