Advertisement
Guest User

Access control 20.08.13

a guest
Aug 20th, 2013
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 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. class Treap {
  19.     struct TN {
  20.         long long k;
  21.         int p;
  22.         TN *l, *r;
  23.         TN(long long K) : k(K), p(rand()), l(0), r(0) {}
  24.     } *t;
  25.     TN *merge(TN *a, TN *b) {
  26.         if (!a || !b)
  27.             return a ? a : b;
  28.         if (a->p > b->p) {
  29.             a->r = merge(a->r, b);
  30.             return a;
  31.         } else {
  32.             b->l = merge(a, b->l);
  33.             return b;
  34.         }
  35.     }
  36.     void split(TN *t, long long k, TN *&a, TN *&b) {
  37.         if (!t) {
  38.             a = b = 0;
  39.             return;
  40.         }
  41.         if (t->k < k) {
  42.             split(t->r, k, t->r, b);
  43.             a = t;
  44.         } else {
  45.             split(t->l, k, a, t->l);
  46.             b = t;
  47.         }
  48.     }
  49.     void foreach(TN *n, char c) {
  50.         if (!n)
  51.             return;
  52.         m.insert(make_pair(n->k, c));
  53.         foreach(n->l, c);
  54.         foreach(n->r, c);
  55.     }
  56. public:
  57.     Treap() : t(0) {}
  58.     void insert(long long k) {
  59.         TN *t1, *t2;
  60.         split(t, k, t1, t2);
  61.         t = merge(merge(t1, new TN(k)), t2);
  62.     }
  63.     void foreach(long long k1, long long k2, char c) {
  64.         TN * t1, *t2, *t3;
  65.         split(t, k1, t1, t2);
  66.         split(t2, k2 + 1, t2, t3);
  67.         foreach(t2, c);
  68.         t = merge(t1, t3);
  69.     }
  70. } t;
  71.  
  72. long long ip(long long a, long long b, long long c, long long d) {
  73.     long long r = 0;
  74.     r |= (a << 24);
  75.     r |= (b << 16);
  76.     r |= (c << 8);
  77.     r |= d;
  78.     return r;
  79. }
  80.  
  81. char z[100010][50];
  82. int n, k, a, b, c, d, q;
  83. long long x[100010], y;
  84.  
  85. int main() {
  86.     //freopen("input.txt", "r", stdin);
  87.     //freopen("output.txt", "w", stdout);
  88.     freopen("access.in", "r", stdin);
  89.     freopen("access.out", "w", stdout);
  90.  
  91.     scanf("%d\n", &n);
  92.     for (int i = 0; i < n; i++)
  93.         gets(z[i]);
  94.     scanf("%d", &k);
  95.     for (int i = 0; i < k; i++) {
  96.         scanf("%d.%d.%d.%d", &a, &b, &c, &d);
  97.         x[i] = ip(a, b, c, d);
  98.         t.insert(x[i]);
  99.     }
  100.  
  101.     for (int i = 0; i < n; i++) {
  102.         char mode = z[i][0] == 'a' ? 'A' : 'D';
  103.         sscanf(z[i], "%*s%*s%d.%d.%d.%d", &a, &b, &c, &d);
  104.         long long net = ip(a, b, c, d);
  105.         if (!strchr(z[i], '/')) {
  106.             t.foreach(net, net, mode);
  107.         } else {
  108.             sscanf(z[i], "%*s%*s%*d.%*d.%*d.%*d/%d", &q);
  109.             q = 32 - q;
  110.             long long mask = 1;
  111.             mask = (mask << 32) - 1;
  112.             mask = (mask << q) & mask;
  113.             net &= mask;
  114.             long long net2 = 1;
  115.             net2 <<= q;
  116.             net2--;
  117.             t.foreach(net, net + net2, mode);
  118.         }      
  119.     }
  120.  
  121.     for (int i = 0; i < k; i++) {
  122.         printf("%c", m.find(x[i]) == m.end() ? 'A' : m[x[i]]);
  123.     }
  124.        
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement