IP聚合题解

前端之家收集整理的这篇文章主要介绍了IP聚合题解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

百度之星打个酱油,结果发现自己真是太菜。。嗯,记录一下这个题,算法很挫,暴力法解决,不过里面的字符串分割记录一下吧,备忘。

Problem Description

当今世界,网络已经无处不在了,小度熊由于犯了错误,当上了度度公司的网络管理员,他手上有大量的 IP列表,小度熊想知道在某个固定的子网掩码下,有多少个网络地址。网络地址等于子网掩码与 IP 地址按位进行与运算后的结果,例如:

子网掩码:A.B.C.D

IP 地址:a.b.c.d

网络地址:(A&a).(B&b).(C&c).(D&d)

Input

第一行包含一个整数 T 1T50 代表测试数据的组数,

接下来 T 组测试数据。每组测试数据包含若干行,

第一行两个正整数 N1N1000,1M50,M 。接下来 N 行,每行一个字符串,代表一个 IP 地址,

再接下来 M 行,每行一个字符串代表子网掩码。IP 地址和子网掩码均采用 A.B.C.D 的形式,其中 ABCD 均为非负整数,且小于等于255。

Output

对于每组测试数据,输出两行:

第一行输出: "Case #i:" 。 i 代表第 i 组测试数据。

第二行输出测试数据的结果,对于每组数据中的每一个子网掩码,输出在此子网掩码下的网络地址的数量

Sample Input
2
5 2
192.168.1.0
192.168.1.101
192.168.2.5
192.168.2.7
202.14.27.235
255.255.255.0
255.255.0.0
4 2
127.127.0.1
10.134.52.0
127.0.10.1
10.134.0.2
235.235.0.0
1.57.16.0
Sample Output
Case #1: 3 2 Case #2: 3 4


Code

#include<iostream>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;


string* split(string str,string pattern)
{
  string::size_type pos;
  string* result = new string[4];
  str += pattern;
  int size = str.size();
 
  int n = 0;
  for(int i = 0; i < size; i++)
  {
    pos = str.find(pattern,i);
    if(pos < size)
    {
      string s = str.substr(i,pos-i);
      //result.push_back(s);
      result[n++] = s;
	  i = pos+pattern.size()-1;
    }
  }
  return result;
}

int main()
{
	int T;
	int n,m;
	string *ip = new string[1000];
	string *address = new string[1000];
	string *mask = new string[50];
	char *temp = new char[10];

	int same_mask_num[50];
	int mask_len,ip_len;
	//vector<string> str_mask_list;
	string *str_mask_list;// = new string[4];
	string *str_ip_list;// = new string[4];
	//vector<string> str_ip_list;
	char *ip_str,*mask_str;

	cin >> T;
	int i,j,k;
	for(i = 0; i < T; ++i)
	{
		cin >> n >> m;
		for(ip_len = 0; ip_len < n; ++ip_len)
		{
			cin >> ip[ip_len];
		}
		for(mask_len = 0; mask_len < m; ++mask_len)
		{
			same_mask_num[mask_len] = 1;
			cin >> mask[mask_len];
			str_mask_list = split(mask[mask_len],".");
			for(j = 0; j < ip_len; ++j)
			{
				address[j] = "";
				str_ip_list = split(ip[j],".");
				for(k = 0; k < 4; ++k)
				{
					ip_str =  const_cast<char*>(str_ip_list[k].c_str());
					mask_str =  const_cast<char*>(str_mask_list[k].c_str());
					sprintf(temp,"%d.",atoi(ip_str)&atoi(mask_str));//itoa( atoi(ip_str)&atoi(mask_str),temp,10);
					address[j] += temp;
					//address[j] +='.';
				}
			}
			sort(address,address+ip_len);
			for(j = 0; j < ip_len-1; ++j)
			{
				if(address[j] != address[j+1])
					same_mask_num[mask_len]++;
			}
		}
		cout << "Case #" << i+1 << ":" << endl;
		for(k = 0; k < mask_len;++k)
			cout << same_mask_num[k] << endl;
	}
	return 0;
}

猜你在找的设计模式相关文章