毫无技巧的死亡暴力
#include <iostream> #include <string> #include <vector> #include <set> #include <algorithm> #include <stdlib.h> using namespace std; set<int> st; void init() { int num = 255; st.insert(num); int i = 0; while(num){ num -= 1 << i; st.insert(num); i++; } } bool not_ip(const vector<int> & cnt){ for(auto num : cnt){ if(num < 0 || num > 255) return true; } return false; } bool not_mask(const vector<int> & cnt){ for(int i = 0; i < cnt.size(); i++){ int num = cnt[i]; if(st.find(num) == st.end()) return true; if(i > 0 && num != 0 && cnt[i - 1] != 255) return true; } if(cnt[3] == 255) return true; if(cnt[0] == 0 && cnt[1] == 0 && cnt[2] == 0 && cnt[3] == 0) return true; return false; } void solve(string& str, vector<int> &cnt){ str.push_back('.'); int pos = 0, next = 0; while(pos < str.length()){ next = str.find('.', pos); if(next == pos) cnt.push_back(-1); else cnt.push_back(atoi(str.substr(pos, next - pos).c_str())); //cout << cnt.back() << endl; pos = next + 1; } cnt.push_back(atoi(str.substr(pos).c_str())); } int main() { init(); vector<int> ans(7, 0); string str; while(cin >> str){ int pos = str.find('~'); if(pos == string::npos) continue; //1.分割ip地址和mask string ip = str.substr(0, pos); string mask = str.substr(pos + 1); vector<int> vip; vector<int> vmask; solve(ip, vip); solve(mask, vmask); //2.判断ip地址和mask是否合法 if(not_ip(vip) || not_mask(vmask)){ ans[5]++; continue; } //3.判断类别 if(vip[0] >= 1 && vip[0] <= 126) ans[0]++; else if(vip[0] >= 128 && vip[0] <= 191) ans[1]++; else if(vip[0] >= 192 && vip[0] <= 223) ans[2]++; else if(vip[0] >= 224 && vip[0] <= 239) ans[3]++; else if(vip[0] >= 240 && vip[0] <= 255) ans[4]++; //4.判断是否私有 if(vip[0] == 10) ans[6]++; else if(vip[0] == 172){ if(vip[1] >= 16 && vip[1] <= 31) ans[6]++; } else if(vip[0] == 192 && vip[1] == 168){ ans[6]++; } } for(auto n : ans) cout << n << " "; cout << endl; return 0; }