#include <bits/stdc++.h> #include <cstdio> #include <iostream> #include <sstream> #include <string> #include <vector> using namespace std; bool isValidIP(string s){ stringstream ss(s); string seg; vector<string> ips; while(getline(ss, seg, '.')){ ips.push_back(seg); } int ip = stoi(ips[0]); if( ip == 0 || ip == 127 ) return false; return true; } bool isErrIP(string s){ stringstream ss(s); string seg; int i = 0; while(getline(ss, seg, '.')){ if(++i > 4 || seg.empty() || stoi(seg) > 255) return true; } return false; } bool isErrMask(string s){ stringstream ss(s); string seg; unsigned int x = 0; while(getline(ss, seg, '.')){ x = (x << 8) + stoi(seg); } if(x == 0 || (~x) == 0) return true; int tz = __builtin_ctz(x); // 返回二进制的后缀零 int n = 32 - __builtin_popcount(x); // 返回二进制的1的个数, 若32 - 1的个数 != 后缀零 说明不合法 if(tz != n) return true; return false; } bool isPrivate(vector<int>& res){ if(res[0] == 10) return true; if(res[0] == 172 && res[1] >= 16 && res[1] <= 31) return true; if(res[0] == 192 && res[1] == 168) return true; return false; } void setIPType(string s, vector<int>& output){ stringstream ss(s); string seg; vector<int> res; while(getline(ss, seg, '.')){ res.push_back(stoi(seg)); } if(isPrivate(res)){ output[6]++; } if(res[0] >= 1 && res[0] <= 126) output[0]++; if(res[0] >= 128 && res[0] <= 191) output[1]++; if(res[0] >= 192 && res[0] <= 223) output[2]++; if(res[0] >= 224 && res[0] <= 239) output[3]++; if(res[0] >= 240 && res[0] <= 255) output[4]++; } int main() { string input; // a b c d e errIp|errMask pIp // 0 1 2 3 4 5 6 vector<int> output(7); while (cin >> input) { stringstream ss(input); vector<string> addr; string str; while(getline(ss, str, '~')){ addr.push_back(str); } if(!isValidIP(addr[0])) continue; if(isErrIP(addr[0]) || isErrMask(addr[1]) ){ output[5]++; continue; } setIPType(addr[0], output); } for(int i = 0; i < 7; i++){ cout << output[i] << " "; } cout << endl; } // 64 位输出请用 printf("%lld")
难顶