#include<iostream>
#include<algorithm>
#include<sstream>
#include<vector>
#include<cctype>
#include<bitset>
using namespace std;
vector<string> spliteToString(string str,char c)
{
vector<string> res;
istringstream is(str);
string temp;
while(getline(is, temp,c)) res.push_back(temp);
return res;
}
//是否纯数字
bool isNumb(string str)
{
for(int i=0;i<str.length();i++)
{
if(!isdigit(str[i])) return false;
}
return true;
}
int main(int argc,char* argv[])
{
vector<int> result(7,0);
string inputStr;
while(getline(cin,inputStr))
{
replace(inputStr.begin(),inputStr.end(),'~','.');
vector<string> strV=spliteToString(inputStr,'.');
vector<int> ips;
bool isbad=false;
string preValue="";
for(int i=0;i<strV.size();i++)
{
if(strV[i].empty()){
isbad=true;
break;
}else if(!isNumb(strV[i]))
{
isbad=true;
break;
}else{
int numb=strtol(strV[i].c_str(),NULL,10);
if(numb>255){
isbad=true;
break;
}
ips.push_back(numb);
if(ips.size()>4)
{
bitset<8> t(numb);
preValue+=t.to_string();
}
}
}
//1、忽略0或者127开头的地址
if(ips[0]==0 || ips[0]==127) continue;
//2、错误ip:数字不能超过255;非纯数字;空字符串
if(isbad) {
result[5]++;
continue;
}
//掩码://不能全是1;不能全是0;从大到小排序后和原来一致
string lastValue=string(preValue);
sort(lastValue.begin(),lastValue.end(),[](char p1,char p2){return p1>p2;});
if(preValue.compare(lastValue)!=0 || preValue=="11111111111111111111111111111111" || preValue=="00000000000000000000000000000000")
{
result[5]++;//非法掩码
continue;
}
//4、A-E类
if(ips[0] >= 1 && ips[0] <= 126)
result[0]++; //A类地址
else if(ips[0] >= 128 && ips[0] <= 191)
result[1]++; //B类地址
else if(ips[0] >= 192 && ips[0] <= 223)
result[2]++; //C类地址
else if(ips[0] >= 224 && ips[0] <= 239)
result[3]++; //D类地址
else if(ips[0] >= 240 && ips[0] <= 255)
result[4]++; //E类地址
//5、是否私有
if(ips[0] == 10)
result[6]++; //私有地址10开头的
else if(ips[0] == 172 && (ips[1] >= 16 && ips[1] <= 31))
result[6]++; //私有地址172.16.0.0-172.31.255.255
else if(ips[0] == 192 && ips[1] == 168)
result[6]++; //私有地址192.168.0.0-192.168.255.255
}
cout<<result[0]<<" "<<result[1]<<" "<<result[2]<<" "<<result[3]
<<" "<<result[4]<<" "<<result[5]<<" "<<result[6]<<endl;
return 0;
}
#include<algorithm>
#include<sstream>
#include<vector>
#include<cctype>
#include<bitset>
using namespace std;
vector<string> spliteToString(string str,char c)
{
vector<string> res;
istringstream is(str);
string temp;
while(getline(is, temp,c)) res.push_back(temp);
return res;
}
//是否纯数字
bool isNumb(string str)
{
for(int i=0;i<str.length();i++)
{
if(!isdigit(str[i])) return false;
}
return true;
}
int main(int argc,char* argv[])
{
vector<int> result(7,0);
string inputStr;
while(getline(cin,inputStr))
{
replace(inputStr.begin(),inputStr.end(),'~','.');
vector<string> strV=spliteToString(inputStr,'.');
vector<int> ips;
bool isbad=false;
string preValue="";
for(int i=0;i<strV.size();i++)
{
if(strV[i].empty()){
isbad=true;
break;
}else if(!isNumb(strV[i]))
{
isbad=true;
break;
}else{
int numb=strtol(strV[i].c_str(),NULL,10);
if(numb>255){
isbad=true;
break;
}
ips.push_back(numb);
if(ips.size()>4)
{
bitset<8> t(numb);
preValue+=t.to_string();
}
}
}
//1、忽略0或者127开头的地址
if(ips[0]==0 || ips[0]==127) continue;
//2、错误ip:数字不能超过255;非纯数字;空字符串
if(isbad) {
result[5]++;
continue;
}
//掩码://不能全是1;不能全是0;从大到小排序后和原来一致
string lastValue=string(preValue);
sort(lastValue.begin(),lastValue.end(),[](char p1,char p2){return p1>p2;});
if(preValue.compare(lastValue)!=0 || preValue=="11111111111111111111111111111111" || preValue=="00000000000000000000000000000000")
{
result[5]++;//非法掩码
continue;
}
//4、A-E类
if(ips[0] >= 1 && ips[0] <= 126)
result[0]++; //A类地址
else if(ips[0] >= 128 && ips[0] <= 191)
result[1]++; //B类地址
else if(ips[0] >= 192 && ips[0] <= 223)
result[2]++; //C类地址
else if(ips[0] >= 224 && ips[0] <= 239)
result[3]++; //D类地址
else if(ips[0] >= 240 && ips[0] <= 255)
result[4]++; //E类地址
//5、是否私有
if(ips[0] == 10)
result[6]++; //私有地址10开头的
else if(ips[0] == 172 && (ips[1] >= 16 && ips[1] <= 31))
result[6]++; //私有地址172.16.0.0-172.31.255.255
else if(ips[0] == 192 && ips[1] == 168)
result[6]++; //私有地址192.168.0.0-192.168.255.255
}
cout<<result[0]<<" "<<result[1]<<" "<<result[2]<<" "<<result[3]
<<" "<<result[4]<<" "<<result[5]<<" "<<result[6]<<endl;
return 0;
}