1. 程式人生 > >Gym100623A Access Control Lists

Gym100623A Access Control Lists

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;
#define
ui 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