数组模拟就可以了 读的时候可以整数读入

1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<queue> 7 #include<cmath> 8 #include<vector> 9 using namespace std; 10 #define LL __int64 11 int len,maxz; 12 LL ip[1050][16][2],pp[40]; 13 int vis[1050],w[1024],di[50],g; 14 char s[50],s1[50],s2[50]; 15 void init() 16 { 17 int i; 18 pp[0] = 1; 19 for(i = 1; i < 32 ; i++) 20 pp[i] = pp[i-1]*2; 21 } 22 void change(int a) 23 { 24 int x[10],o=0,i; 25 while(a) 26 { 27 x[++o] = a%2; 28 a/=2; 29 } 30 for(i = 1; i <= 8-o ; i++) 31 di[++g] = 0; 32 for(i = o ; i>= 1; i--) 33 di[++g] = x[i]; 34 } 35 LL swit(int k,int e) 36 { 37 int i; 38 LL sum=0; 39 if(k==1) 40 for(i = 1 ; i <= g ; i++) 41 sum+=di[i]*pp[32-i]; 42 else 43 { 44 for(i = 1; i <= e ; i++) 45 sum+=di[i]*pp[32-i]; 46 for(i = e+1 ; i <= 32 ; i++) 47 sum+=pp[32-i]; 48 } 49 return sum; 50 } 51 int main() 52 { 53 int m,n,i,j;init(); 54 int a,b,c,d,e; 55 char cc; 56 while(scanf("%c",&cc)!=EOF) 57 { 58 if(cc=='E') 59 { 60 scanf("%d%d",&n,&m); 61 w[n] = m; 62 maxz = max(maxz,n); 63 for(i = 1; i <= m ;i++) 64 { 65 getchar(); 66 scanf("%d.%d.%d.%d/%d",&a,&b,&c,&d,&e); 67 g=0; 68 change(a);change(b);change(c);change(d); 69 ip[n][i][0] = swit(1,0); 70 ip[n][i][1] = swit(2,e); 71 } 72 } 73 else if(cc=='F') 74 { 75 scanf("%d.%d.%d.%d",&a,&b,&c,&d); 76 g=0; 77 change(a);change(b);change(c);change(d); 78 LL fs1 = swit(1,0); 79 scanf("%d.%d.%d.%d",&a,&b,&c,&d); 80 g=0; 81 change(a);change(b);change(c);change(d); 82 LL fs2 = swit(1,0); 83 int flag = 0; 84 for(i = 1 ; i <= maxz ; i++) 85 { 86 int f=0,ff=0; 87 if(vis[i]) continue; 88 for(j = 1; j <= w[i] ; j++) 89 { 90 if(fs1>=ip[i][j][0]&&fs1<=ip[i][j][1]) 91 f = 1; 92 if(fs2>=ip[i][j][0]&&fs2<=ip[i][j][1]) 93 ff = 1; 94 } 95 if(ff&&f) 96 { 97 flag = 1; 98 break; 99 } 100 } 101 if(flag) 102 printf("F "); 103 else 104 printf("D "); 105 } 106 else 107 { 108 scanf("%d",&n); 109 vis[n] = 1; 110 } 111 gets(s); 112 } 113 return 0; 114 }