Gym100623A Access Control Lists
阿新 • • 發佈:2018-11-10
turn 網段 lis syn 進行 mes gym str inf
Gym 100623A | Access Control Lists |
這個題很sb啊,就是去設置個交換機
我們可以給一個IP進行設置,也可以對一個網段就行設置,但是IP是優於網段的,比如樣例的第一個
網段是什麽呢,就是一個IP+子網掩碼,這個IP的前x位2進制位為1,那麽IP就是掩碼為32
但是樣例的問題要解決掉啊,就是先allow再deny也可以的,所以就設置一個標記好了,deny就是負的
非常巧妙地解決了這個問題,dreamoon牛逼
#include<bits/stdc++.h> using namespace std; #defineui unsigned int ui ip; map<ui,int>H[33]; int main() { freopen("access.in","r",stdin); freopen("access.out","w",stdout); ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int n,q; cin>>n; string s1,s2,s; for(int i=1,x; i<=n; i++) { cin>>s1>>s2>>s; for(int j=0; s[j]; j++)if(s[j]<‘0‘||s[j]>‘9‘)s[j]=‘ ‘; int tot=0,flag,a[5]; stringstream ss(s); while(ss>>a[tot])tot++; flag=tot>4?a[4]:32,ip=0; for(int j=0; j<4; j++)ip=ip<<8|a[j]; if(!H[flag].count(ip)) {if(s1[0]==‘d‘)H[flag][ip]=-i; else H[flag][ip]=i; } } cin>>q; for(int i=0,x; i<q; i++) { cin>>s; for(int j=0; s[j]; j++)if(s[j]<‘0‘||s[j]>‘9‘)s[j]=‘ ‘; stringstream ss(s); ip=0; while(ss>>x)ip=ip<<8|x; int res=10000000; for(int j=32; j>=0; j--) { if(H[j].count(ip)&&abs(res)>abs(H[j][ip]))res=H[j][ip]; ip^=((ip>>(32-j))&1)<<(32-j); } cout<<(res>0?‘A‘:‘D‘); } return 0; }
Gym100623A Access Control Lists