在搜索引擎后端服务中,需要对恶意的抓取进行限制,其中的一个环节即对访问IP进行限制。请设计一个IP过滤器,实现对访问的IP限制的功能。对IP的限制数据有三种格式:
1.全IP:如222.205.58.16
2.前面带 *:如 *.58.16
3.后面带 *:如 222.205.58.*
带 * 的表示匹配到任意的IP段均可,且 * 可以代表多个ip段,且 * 只能出现在开头或者结尾。
现给出若干条需要过滤的规则,以及若干输入的IP,你需要输出这若干条IP是否会被过滤
输入的第一行是过滤规则的条数N和需要过滤的IP数量M,之后的N行为IP的过滤规则且均合法,再之后的M行为需要进行判断是否被过滤的IP。其中N<100,M<50。
0:该条IP不会被过滤
1:该条IP会被过滤
总共M条需要判断的IP需要以空格作为区分
5 3 222.205.58.16 *.58.16 222.205.58.* *.16 224.* 222.205.58.17 222.205.59.19 223.205.59.16
1 0 1
由于222.205.58.17这个IP匹配到222.205.58.*这条过滤规则,222.205.59.19没有匹配到任何过滤规则,223.205.59.16匹配到*.16这条过滤规则,所以输出1 0 1
#include<bits/stdc++.h> using namespace std; unordered_map<char,int> mp={{'.',10},{'*',11}}; struct Node { bool is_End; Node* son[12]; Node() { is_End=false; for(int i=0;i<12;i++) son[i]=NULL; } }*root; void insert(Node *p,string & str) { for(int i=0;i<str.size();i++) { int u=isdigit(str[i])?(str[i]-'0'):mp[str[i]]; if(!p->son[u]) p->son[u]=new Node(); p=p->son[u]; } p->is_End=true; } bool search(Node *p,string &str) { for(int i=0;i<str.size();i++) { int u=isdigit(str[i])?(str[i]-'0'):mp[str[i]]; if(!p->son[u]) return false; p=p->son[u]; if(p->son[11]) return true; } return p->is_End; } int main() { int N,M; while(cin>>N>>M) { root=new Node(); string str; for(int i=0;i<N;i++) { cin>>str; insert(root,str); reverse(str.begin(),str.end()); insert(root,str); } int ans; for(int i=0;i<M;i++) { ans=0; cin>>str; ans= ans || search(root,str); reverse(str.begin(),str.end()); ans= ans || search(root,str); cout<<ans<<" "; } } return 0; }
import re # main function def main(): N, M = map(int, input().split(' ')) # 规则列表 rule = [] # IP列表 ip = [] # 结果列表 res = [] # 构建规则列表时将规则转化成正则表达式 # 简单粗暴一点来说,就是将IP字段中的'.'换成'\.',将'*'换成'.*' # 举个简单的例子:'192.168.1.*'转换成正则表达式可以写成'192\.168\.1\..*' # 这样就可以直接进行匹配了 for i in range(0, N): rule.append(input().replace('.', '\.').replace('*', '.*')) for i in range(0, M): ip.append(input()) for i in ip: x = 0 for j in rule: try: t = re.search(j, i) if t.group() == i: x = 1 break except Exception: pass res.append(x) out = "" for i in res: out += "{} ".format(i) print(out) if __name__ == "__main__": main()
#include <iostream> #include <string.h> using namespace std; class IP { int N; int M; public: IP(int M=0,int N=0) { this->N = N; this->M = M; } void get_ip(void) { char** rule =new char*[M]; for(int i=0; i<M; i++) { rule[i] = new char[16]; cin >> rule[i]; if(rule[i][0] == '*') { memmove(&rule[i][0],&rule[i][1],16); continue; } int len = strlen(rule[i]); if(rule[i][len-1] == '*') { rule[i][len-1] = 0; } } char ip[16] = {}; bool flag = false; for(int i=0; i<N; i++) { cin>>ip; for(int i=0;i<M; i++) { if(NULL != strstr(ip,rule[i])) { flag = true; } } if(flag) cout<<"1 "; else cout <<"0 "; flag = false; } } }; int main() { int M=0; int N=0; cin>>M>>N; IP ip(M,N); ip.get_ip(); }
/** * 前缀 后缀 的匹配问题 easy */ import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int M = sc.nextInt(); sc.nextLine(); //读取规则 String[] patterns = new String[N]; for(int i =0 ;i < N;i++){ patterns[i] = sc.nextLine(); } //读取IP String[] IPs = new String[M]; for(int i = 0;i < M; i++){ IPs[i] = sc.nextLine(); } //暴力匹配 for(int i = 0; i < IPs.length;i++){ boolean lock = false; for(int j = 0; j < patterns.length;j++){ String t = ""; if(patterns[j].charAt(0) == '*'){ t = patterns[j].replace("*",""); if(IPs[i].endsWith(t)){ System.out.print(1 + " "); lock = true; break; } }else if(patterns[j].charAt(patterns[j].length()-1) == '*'){ t = patterns[j].replace("*",""); if(IPs[i].startsWith(t)){ System.out.print(1 + " "); lock = true; break; } }else{ if(patterns[j].equals(IPs[i])){ System.out.print(1 + " "); lock = true; break; } } } if(lock == false){ System.out.print(0 + " "); } } } }
#include<iostream> #include<string> #include<algorithm> using namespace std; int solution(string str1[],string str2,int m) { int j=0,k=0; for (int i = 0; i < m; i++) { // 判断规则中是否有*号存在 if (str1[i].find('*') == string::npos) { if(str1[i].compare(str2) == 0) return 1; // 过滤掉了 } else if (str1[i].find('*') == 0) { // * 号在前,从后往前比 j = str1[i].size()-1; k = str2.size()-1; for(;j>=0,k>=0;j--,k--) { if (str1[i].c_str()[j] != str2.c_str()[k]) break; } } else { // * 号在后,从前往后比 j=0,k=0; for(;j<=str1[i].size()-1,k<=str2.size()-1;j++,k++) { if (str1[i].c_str()[j] != str2.c_str()[k]) break; } } if (str1[i].c_str()[j] == '*') { return 1; // 如果只有*不等表示其他都一样还是要过滤掉 } } return 0;// 循环结束后都不符合要求表示不过滤掉 } int main() { int m,n;// m 规则,n条数 cin>>m; cin>>n; string * arr1 = new string[m];// m 条规则 string * arr2 = new string[n];// n 条ip int * arr = new int[n]; for (int i = 0; i < m; i++) { cin>>arr1[i]; } for (int j = 0; j < n; j++) { cin>>arr2[j]; } for (int k = 0; k < n; k++) { arr[k]= solution(arr1,arr2[k],m); cout<<arr[k]<<" "; } cout<<endl; return 0; }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); int M = in.nextInt(); String[] ip = new String[M]; String[] strs = new String[N]; int[] boo = new int[M]; for (int i = 0; i < N; i++) { strs[i] = in.next(); } for (int i = 0; i < M; i++) { ip[i] = in.next(); } for (int i = 0;i<N;i++){ if (strs[i].startsWith("*")){ strs[i] = strs[i].substring(1); } if (strs[i].endsWith("*")){ strs[i] = strs[i].substring(0,strs[i].length()-1); } } for (int i =0;i<M;i++){ for (int j =0;j<N;j++){ if (ip[i].contains(strs[j])) boo[i] = 1; } } for(int b:boo){ System.out.print(b+" "); } } }
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
int n=sc.nextInt(); String[] strs=new String[n];
sc.nextLine();
for(int i=0;i<m;i++)pattern[i]=sc.nextLine();
for(int i=0;i<n;i++)strs[i]=sc.nextLine();
for(int i=0;i<n;i++){
boolean flag=true;
String s=strs[i];
for(int j=0;j<m;j++){
if(isMatch(s,pattern[j],0,0)){
System.out.print(1+" ");
flag=false;
break;
}
}
if(flag)System.out.print(0+" ");
}
}
public static boolean isMatch(String s,String p,int i,int j){
String[] ss=s.split("\\.");
String[] ps=p.split("\\.");
if(i==ss.length){
while(j<ps.length && ps[j].equals("*"))j++;
return j==ps.length;
}
if(ps[j].equals("*")){
return isMatch(s,p,i+1,j) || isMatch(s,p,i,j+1);
}
return ss[i].equals(ps[j]) && isMatch(s,p,i+1,j+1);
}
}
import java.util.*; class Node { String a; String b; String c; String d; Node (String v1, String v2) { if (v1.equals("*")) { a = "0"; b = "0"; c = "0"; d = v2; } else { a = v1; b = "0"; c = "0"; d = "0"; } } Node (String v1, String v2, String v3) { if (v1.equals("*")) { a = "0"; b = "0"; c = v2; d = v3; } else if (v3.equals("*")) { a = v1; b = v2; c = "0"; d = "0"; } } Node (String v1, String v2, String v3, String v4) { if (v1.equals("*")) { a = "0"; b = v2; c = v2; d = v3; } else if (v4.equals("*")) { a = v1; b = v2; c = v3; d = "0"; } else { a = v1; b = v2; c = v3; d = v4; } } } public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); Node[] arr = new Node[n]; for (int i = 0; i < n; i++) { String input = sc.next(); String[] cur = input.split("\\."); if (cur.length == 4) { arr[i] = new Node(cur[0], cur[1], cur[2], cur[3]); } else if (cur.length == 3) { arr[i] = new Node(cur[0], cur[1], cur[2]); } else if (cur.length == 2) { arr[i] = new Node(cur[0], cur[1]); } } for (int i = 0; i < m; i++) { String input = sc.next(); // System.out.println(input); String[] cur = input.split("\\."); // System.out.println(Arrays.toString(cur)); Node node = new Node(cur[0], cur[1], cur[2], cur[3]); boolean res = false; for (int j = 0; j < n; j++) { if ((node.a.equals(arr[j].a) || arr[j].a.equals("0")) && (node.b.equals(arr[j].b) || arr[j].b.equals("0")) && (node.c.equals(arr[j].c) || arr[j].c.equals("0")) && (node.d.equals(arr[j].d) || arr[j].d.equals("0"))) { res = true; break; } } if (res) { System.out.print(1 + " "); } else { System.out.print(0 + " "); } } } }
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { // String[] s1 = {"222","205","58","17"}; // String[] s2 = {"222","205","58","*"}; // System.out.println(pass(s1, s2)?1:0); Scanner scanner; List<String[]> list = new ArrayList<String[]>(); int n, m; String temp; String[] split; scanner = new Scanner(System.in); n = scanner.nextInt(); m = scanner.nextInt(); temp = scanner.nextLine(); // System.out.println("开始:"+temp.length()); for(int i=0; i<n; i++){ temp = scanner.nextLine(); split = temp.split("\\."); // System.out.println(temp+split.length); list.add(split); } for(int i=0; i<m; i++){ temp = scanner.nextLine(); split = temp.split("\\."); // System.out.println(temp+split.length); System.out.print(isPass(split, list)?1+" ":0+" "); } } public static boolean isPass(String[] split, List<String[]> list){ for(String[] sps:list){ if(pass(split,sps)){ return true; } } return false; } public static String[] removeStrings(String[] strs, int index){ if(index<0||index>=strs.length){ return null; } if(strs.length==0){ return new String[0]; } String[] res = new String[strs.length-1]; int resIndex = 0; if(strs.length>1){ for(int i=0; i< strs.length; i++){ if(i != index){ res[resIndex ++] = strs[i]; } } } return res; } public static boolean pass(String[] split, String[] sps){ if(split.length == 0&& sps.length == 0){ return true; } if(sps.length==0&&split.length!=0){ return false; } if("*".equals(sps[0])){ if(split.length==0){ return pass(split,removeStrings(sps,0)); } return pass(removeStrings(split,0),sps)|| pass(split,removeStrings(sps,0)); } if(split.length!=0 && split[0].equals(sps[0])){ // System.out.println("s1"+split[0]+"s2:"+sps[0]); return pass(removeStrings(split,0), removeStrings(sps,0)); } return false; } }suceess!
n, m = input().split(' ') n = int(n) m = int(m) s = set() suffix = set() for i in range(n): ip = tuple(input().split('.')) if ip[0] == '*': suffix.add(ip[1:]) elif ip[-1] == '*': s.add(ip[:-1]) else: s.add(ip) #print(s) #print(suffix) res = [] for j in range(m): #l = input().split('.') ip = tuple(input().split('.')) length = len(ip) flag = True for i in range(1, length+1): #print(ip[:i]) if ip[:i] in s: flag = False for i in range(0, length): #print(ip[i:]) if ip[i:] in suffix: flag = False if flag: res.append(0) else: res.append(1) for i in range(len(res)): if i != len(res)-1: print(res[i], end=' ') else: print(res[i])