Advertisement
Guest User

Access control 21.08.13

a guest
Aug 21st, 2013
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.07 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include <bitset>
  7. #include <iostream>
  8. #include <stack>
  9. #include <queue>
  10. #include <set>
  11. #include <map>
  12. #include <string>
  13. #include <algorithm>
  14. using namespace std;
  15.  
  16. map<long long, char> m;
  17.  
  18. long long ip(long long a, long long b, long long c, long long d) {
  19.         long long r = 0;
  20.         r |= (a << 24);
  21.         r |= (b << 16);
  22.         r |= (c << 8);
  23.         r |= d;
  24.         return r;
  25. }
  26.  
  27. char z[100010][50];
  28. int n, k, a, b, c, d, q;
  29. long long x[100010], y;
  30.  
  31. set<long long> ips;
  32.  
  33. int main() {
  34.         freopen("access.in", "r", stdin);
  35.         freopen("access.out", "w", stdout);
  36.  
  37.         scanf("%d\n", &n);
  38.         for (int i = 0; i < n; i++)
  39.                 gets(z[i]);
  40.         scanf("%d", &k);
  41.         for (int i = 0; i < k; i++) {
  42.                 scanf("%d.%d.%d.%d", &a, &b, &c, &d);
  43.                 x[i] = ip(a, b, c, d);
  44.                 ips.insert(x[i]);
  45.         }
  46.  
  47.         for (int i = 0; i < n; i++) {
  48.                 char mode = z[i][0] == 'a' ? 'A' : 'D';
  49.                 sscanf(z[i], "%*s%*s%d.%d.%d.%d", &a, &b, &c, &d);
  50.                 long long net = ip(a, b, c, d);
  51.                 long long net2 = 0;
  52.                 if (strchr(z[i], '/')) {
  53.                         sscanf(z[i], "%*s%*s%*d.%*d.%*d.%*d/%d", &q);
  54.                         q = 32 - q;
  55.                         long long mask = 1;
  56.                         mask = (mask << 32) - 1;
  57.                         mask = (mask << q) & mask;
  58.                         net &= mask;
  59.                         net2 = 1;
  60.                         net2 <<= q;
  61.                         net2--;
  62.                 }      
  63.         set<long long>::iterator first = ips.lower_bound(net), f = first;
  64.         set<long long>::iterator last  = ips.upper_bound(net + net2);
  65.         for( ; f != last; ++f) {
  66.             m.insert(make_pair(*f, mode));
  67.         }
  68.         ips.erase(first, last);
  69.         }
  70.  
  71.         for (int i = 0; i < k; i++) {
  72.                 printf("%c", m.find(x[i]) == m.end() ? 'A' : m[x[i]]);
  73.         }
  74.                
  75.         return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement