1 /*********************2016-04-07
2 INPUT :
3 5 5
4 allow 1.2.3.4/30
5 deny 1.1.1.1
6 allow 127.0.0.1
7 allow 123.234.12.23/3
8 deny 0.0.0.0/0
9 1.2.3.4
10 1.2.3.5
11 1.1.1.1
12 100.100.100.100
13 219.142.53.100
14
15 OUTPUT:
16 FINDED
17 FINDED
18 NO
19 FINDED
20 YES
21 ********************/
22 #include <iostream>
23 #include <bitset>
24 #include <math.h>
25 #include <vector>
26 #include <string>
27 using namespace std;
28 /*ip地址转成二进制*/
29 string transform(string &in)
30 {
31 string out;
32 int count = 0;
33 int dotcount = 0;
34 int temp = 0;
35 for (int i=0;i<in.size();i++)
36 {
37 while(in[i]!='.')
38 {
39 count++;
40 i++;
41 }
42
43 if (count == 3)
44 {
45 temp = in[i-1]-'0' + 10*(in[i-2] - '0') + 100*(in[i-3] - '0');
46 }
47 else if (count == 2)
48 {
49 temp = in[i-1]-'0' + 10*(in[i-2] - '0');
50 }
51 else if (count == 1)
52 {
53 temp = in[i-1]-'0';
54 }
55 string binaryTemp;
56 binaryTemp = bitset<8>(temp).to_string();
57 out+=binaryTemp;
58 count = 0;
59 dotcount++;
60 /*最后一个.后面的地址*/
61 if (dotcount == 3)
62 {
63 i++;
64 while( i < in.size() && in[i] != '/')
65 {
66 count++;
67 i++;
68 }
69 if (count == 3)
70 {
71 temp = in[i-1]-'0' + 10*(in[i-2] - '0') + 100*(in[i-3] - '0');
72 }
73 else if (count == 2)
74 {
75 temp = in[i-1]-'0' + 10*(in[i-2] - '0');
76 }
77 else if (count == 1)
78 {
79 temp = in[i-1]-'0';
80 }
81 string binaryTemp;
82 binaryTemp = bitset<8>(temp).to_string();
83 out+=binaryTemp;
84 return out;
85 }
86 }
87 }
88 /* 匹配函数 */
89 string match(vector<vector<string>> in,string &ss)
90 {
91 string result;
92 string s;
93 for (int i=0;i<in.size();i++)
94 {
95 s = ss;//每次外循环都需要将输入还原
96 for(int j=in[i][1].size()-1;j>in[i][1].size()-4;j--)
97 {
98 if (in[i][1][j] == '/')//带掩码形式
99 {
100 string pos;
101 j++;
102 while(j!=in[i][1].size())
103 {
104 pos+=in[i][1][j];
105 j++;
106 }
107 int posi;//存储掩码
108 if (pos.size() == 1)
109 {
110 posi = pos[0] - '0';
111 }
112 else if (pos.size() == 2)
113 {
114 posi = 10*(pos[0] - '0') + (pos[1] - '0');
115 }
116
117 in[i][1] = transform(in[i][1]);
118 s= transform(s);
119 /*根据掩码来调整转换后的二进制数*/
120 for (int m=posi;m<32;m++)
121 {
122 in[i][1][m] = '0';
123 s[m] = '0';
124 }
125
126 if (s == in[i][1])
127 {
128 if (in[i][0] == "deny")
129 {
130 result = "NO";
131 return result;
132 }
133 else if (in[i][0] == "allow")
134 {
135 result = "FINDED";
136 return result;
137 }
138 }
139 }
140 }
141 //不带掩码形式
142 if (s == in[i][1])
143 {
144 if (in[i][0] == "deny")
145 {
146 result = "NO";
147 return result;
148 }
149 else if (in[i][0] == "allow")
150 {
151 result = "FINDED";
152 return result;
153 }
154 }
155 }
156 result = "YES";
157 return result;
158 }
159
160 int main()
161 {
162
163 int N,M;
164 cin>>N>>M;
165 string judge;//allow OR deny
166 string ipAddress;
167 vector<string> temp;
168 vector<vector<string>> input;
169 for (int i=0;i<N;i++)
170 {
171 temp.clear();
172 cin>>judge>>ipAddress;
173 temp.push_back(judge);
174 temp.push_back(ipAddress);
175 input.push_back(temp);
176
177 }
178 string in;
179 for (int i=0;i<M;i++)
180 {
181 cin>>in;
182 cout<<match(input,in)<<endl;
183 }
184 system("pause");
185 return 0;
186 }