#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")
难顶



京公网安备 11010502036488号