首页 > 试题广场 >

根据IP查询城市

[编程题]根据IP查询城市
  • 热度指数:55 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定IP段到城市的映射表:【起始IP地址,终止IP地址,城市名】,根据给定的IP查询该IP对应的城市名。

其中IP以IPV4的方式给定,例如:10.12.1.3,城市名为一串英文字符,字符间没有空格。例如:

192.15.0.2 192.16.1.5 beijing
168.3.4.5 168.3.6.8 shanghai
177.2.3.4 177.4.5.6 chongqing
映射表中,不同城市的IP地址不重叠,即:不会出现某个城市的起始IP地址小于另一个城市的终止IP地址的情况;一个城市可能有多个IP段(起始IP地址 + 终止IP地址);可能存在某个IP地址范围没有对应的城市信息。

如果要查询的IP地址属于某个城市,那么输出该城市的名字;如果IP地址不属于任何一个城市,那么输出字符串:none。



输入描述:
第一行为一个整数N,表示映射表有多少条记录。
从第二行开始到第N + 1行为N条IP到城市的映射记录,一行一条记录,每条记录包括起始IP地址,终止IP地址和城市名,这三部分之间用空格分隔。
从第N + 2行开始为需要查询的IP地址,一行一个IP地址。


输出描述:
输出需要查询的IP地址对应的城市名,一行一个城市名,如果IP没有对应的城市信息,那么输出none
示例1

输入

3
192.15.0.2 192.16.1.5 beijing
168.3.4.5 168.3.6.8 shanghai
177.2.3.4 177.4.5.6 chongqing
192.15.1.2
192.16.2.3
168.2.3.4
168.3.5.9

输出

beijing
none
none
shanghai
#include <bits/stdc++.h>
using namespace std;
struct IpRange
{
    unsigned int low;
    unsigned int height;
    string address;
    bool operator< (const IpRange& range) const
    {
        return low < range.low;
    }
};

int main()
{
    int n,a,b,c,d;
    string ip_address;
    cin >> n;
    set<IpRange> s;
    for(int i = 0;i < n;i++)
    {
        IpRange range;
        scanf("%d.%d.%d.%d", &a,&b,&c,&d);
        range.low = (a << 24) + (b << 16) + (c << 8) + d;
        scanf("%d.%d.%d.%d", &a,&b,&c,&d);
        range.height = (a << 24) + (b << 16) + (c << 8) + d;
        cin >> ip_address;
        range.address = ip_address;
        s.insert(range);
    }
    while(~scanf("%d.%d.%d.%d", &a,&b,&c,&d))
    {
        unsigned int tmp = (a << 24) + (b << 16) + (c << 8) + d;
        bool find = false;
        for(auto it = s.begin();it != s.end();it++)
        {
            if(it->low <= tmp && it->height >= tmp)
            {
                cout << it->address << endl;
                find = true;
                break;
            }
        }
        if(!find)
        {
            cout << "none" << endl;
        }
    }
    return 0;
}

发表于 2022-03-16 21:46:20 回复(0)