题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
http://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
#include<bits/stdc++.h> #include<sstream> using namespace std; using LL = long long; LL vec2num(vector<int>& vec) { LL res = 0; for(auto & t: vec) res = res << 8 | t; return res; } bool check(int i, vector<int>&vec) { if( i % 3 ==0 ) { LL res = vec2num(vec); res |= res - 1; if (res != 0xffffffff) return false; } for(int j = 0; j < vec.size(); ++j) { if(j == 0 && vec[j] == 0) return false; else if (vec[j] < 0 || vec[j] > 255) return false; } return true; } bool same_net(vector<int>& mask, vector<int>& ip1, vector<int>& ip2) { for(int i = 0; i < mask.size(); ++i) { int res1 = mask[i] & ip1[i]; int res2 = mask[i] & ip2[i]; if( res1 != res2) return false; } return true; } int main() { string line; vector<string>a; int res = 0; int x,y,z,n; char c; vector<vector<int> > arr; while(~scanf("%d.%d.%d.%d",&x,&y,&z,&n)) { arr.push_back({x,y,z,n}); } for(int i = 0; i < arr.size(); i+=3) { bool res_m = check(i, arr[i]); bool res_1 = check(i+1, arr[i+1]); bool res_2 = check(i+2, arr[i+2]); if(!(res_m && res_1 && res_2)) { cout<< 1 << endl; continue; } LL mask = vec2num(arr[i]); if(same_net(arr[i],arr[i+1],arr[i+2])) cout << 0 << endl; else cout << 2 << endl; } return 0; }
