微软2016笔试题第二题 403Forbidden

  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 }

 

posted on 2016-04-07 09:31  可乐少爷  阅读(330)  评论(0)    收藏  举报