坑点:accept和deny的ip可能相同,需加个判断
#include <cstdio> #include <cstdlib> #include <vector> #include <string> #include <cstring> #include <iostream> #define OO 0x0fffffff #define MIN(a,b) (a<b?a:b) using namespace std; struct NODE{ NODE *left,*right; int aid; bool accept; NODE(){ aid = -1; left = right = NULL; } }; NODE root; int digits[4]; void add_acl(int id,char *acl,bool accept){ NODE *ptr = &root; for(int i=0;acl[i];i++){ if(acl[i]=='1') { if(ptr->right==NULL) ptr->right = new NODE(); ptr = ptr->right; } else{ if(ptr->left==NULL) ptr->left = new NODE(); ptr = ptr->left; } } if(ptr->aid<0){ ptr->aid = id; ptr->accept = accept; } } void parse_ip(char *input,char *output,int len){ sscanf(input,"%d.%d.%d.%d",digits+0,digits+1,digits+2,digits+3); int i,j; for(i=0;i<4;i++){ int td = digits[i]; for(j=(i+1)*8-1;j>=i*8;j--){ output[j] = '0'+(td&1); td>>=1; } } output[len]='