Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <bitset>
- #include <iostream>
- #include <stack>
- #include <queue>
- #include <set>
- #include <map>
- #include <string>
- #include <algorithm>
- using namespace std;
- map<long long, char> m;
- long long ip(long long a, long long b, long long c, long long d) {
- long long r = 0;
- r |= (a << 24);
- r |= (b << 16);
- r |= (c << 8);
- r |= d;
- return r;
- }
- char z[100010][50];
- int n, k, a, b, c, d, q;
- long long x[100010], y;
- set<long long> ips;
- int main() {
- freopen("access.in", "r", stdin);
- freopen("access.out", "w", stdout);
- scanf("%d\n", &n);
- for (int i = 0; i < n; i++)
- gets(z[i]);
- scanf("%d", &k);
- for (int i = 0; i < k; i++) {
- scanf("%d.%d.%d.%d", &a, &b, &c, &d);
- x[i] = ip(a, b, c, d);
- ips.insert(x[i]);
- }
- for (int i = 0; i < n; i++) {
- char mode = z[i][0] == 'a' ? 'A' : 'D';
- sscanf(z[i], "%*s%*s%d.%d.%d.%d", &a, &b, &c, &d);
- long long net = ip(a, b, c, d);
- long long net2 = 0;
- if (strchr(z[i], '/')) {
- sscanf(z[i], "%*s%*s%*d.%*d.%*d.%*d/%d", &q);
- q = 32 - q;
- long long mask = 1;
- mask = (mask << 32) - 1;
- mask = (mask << q) & mask;
- net &= mask;
- net2 = 1;
- net2 <<= q;
- net2--;
- }
- set<long long>::iterator first = ips.lower_bound(net), f = first;
- set<long long>::iterator last = ips.upper_bound(net + net2);
- for( ; f != last; ++f) {
- m.insert(make_pair(*f, mode));
- }
- ips.erase(first, last);
- }
- for (int i = 0; i < k; i++) {
- printf("%c", m.find(x[i]) == m.end() ? 'A' : m[x[i]]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement