【HUAWEI OJ 题库】路由表最长匹配

2024-01-11 04:10

本文主要是介绍【HUAWEI OJ 题库】路由表最长匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

路由表最长匹配是IP(v4) 路由器的最基本的功能之一,当路由器收到一个IP数据包时,会将数据包的目的IP地址与本地路由表进行匹配。
格式:目的IP地址为dstIP,路由表中每条路由为entryIP/掩码长度m,如 10.166.50.0/23。
注:所有IP地址以点分十进制字符串表示。
匹配规则:
如果 entryIP 和 dstIP 的二进制表示的前 m 个bit相同,则说明该条路由是匹配的。
注:10.166.50.0的二进制表示如下:
在这里插入图片描述
0.0.0.0/0是默认路由,它与任何目的IP地址都是匹配的,m 值为 0 。
所有匹配的路由中,m 最大的即为“最长匹配”。

现给出目的IP地址和本地路由表,请输出最长匹配的路由;如果有多条,则按给出的先后顺序输出最先的;如果没有匹配的,输出字符串empty。

解答要求
时间限制:1000ms, 内存限制:256MB

输入

第一行是目的IP地址,点分十进制表示的字符串。
第二行一个整数 n,表示路由表中的路由数量,取值范围为 [1, 10000]。
接下来 n 行表示 n 条路由,其中掩码长度 m 的取值范围为[0, 32],m 值为 0 仅存在于路由 0.0.0.0/0 。

输出

最长匹配的路由,格式同输入;如果没有则输出字符串empty。

样例

输入样例 1

192.168.0.3
6
10.166.50.0/23
192.0.0.0/8
10.255.255.255/32
192.168.0.1/24
127.0.0.0/8
192.168.0.0/24

输出样例 1

192.168.0.1/24

提示样例 1

匹配的路由如下图所示,先按匹配的长度,再按输入先后顺序,结果为192.168.0.1/24

在这里插入图片描述
输入样例 2

202.96.96.68
1
200.18.24.0/24

输出样例 2

empty

提示样例 2

200.18.24.0/24 不匹配;

输入样例 3

10.110.32.77
2
127.0.0.1/8
0.0.0.0/0

输出样例 3

0.0.0.0/0

提示样例 3

127.0.0.1/8 不匹配; 0.0.0.0/0 是默认路由,是匹配的,且是唯一匹配的。

提示

注:可以用十进制数掩码长度来简单表示一个子网掩码,掩码长度指的是二进制子网掩码中连续1的个数,例如掩码长度 24 表示子网掩码的二进制形式为11111111.11111111.11111111.00000000(十进制形式为:255.255.255.0; 长度24不包括分隔符点),掩码长度 27 表示子网掩码的二进制形式为11111111.11111111.11111111.11100000(十进制形式为255.255.255.224)

编码实现(Java)

    public static void main(String[] args) {String dstIp = "192.168.0.3";String[][] ipTable = {{"10.166.50.0", "23"},{"192.0.0.0", "8"},{"10.255.255.255", "32"},{"192.168.0.1", "24"},{"127.0.0.0", "8"},{"192.168.0.0", "24"}};String result = routerSearch(dstIp, ipTable);System.out.println(result);}private static String routerSearch(String dstIp, String[][] ipTable) {int maxMatchLen = -1;String longestRoute = "empty";for (String[] route : ipTable) {String routeIp = route[0];int maskLen = Integer.parseInt(route[1]);String[] routeIpParts = routeIp.split("\\.");String[] dstIpParts = dstIp.split("\\.");int matchLen = 0;for (int i = 0; i < Math.min(routeIpParts.length, dstIpParts.length); i++) {String routeBinary = String.format("%8s", Integer.toBinaryString(Integer.parseInt(routeIpParts[i]))).replace(' ', '0');String dstBinary = String.format("%8s", Integer.toBinaryString(Integer.parseInt(dstIpParts[i]))).replace(' ', '0');for (int j = 0; j < routeBinary.length(); j++) {if (routeBinary.charAt(j) == dstBinary.charAt(j)) {matchLen++;} else {break;}}}if (matchLen >= maskLen && matchLen > maxMatchLen) {maxMatchLen = matchLen;longestRoute = routeIp + "/" + maskLen;}}return longestRoute;}

优化后代码

    public static void main(String[] args) {String dstIp = "192.168.0.3";String[][] ipTable = {{"10.166.50.0", "23"},{"192.0.0.0", "8"},{"10.255.255.255", "32"},{"192.168.0.1", "24"},{"127.0.0.0", "8"},{"192.168.0.0", "24"}};String result = routerSearch(dstIp, ipTable);System.out.println(result);}private static String routerSearch(String dstIp, String[][] ipTable) {int maxMatchLen = -1;String longestRoute = "empty";for (String[] route : ipTable) {String routeIp = route[0];int maskLen = Integer.parseInt(route[1]);String[] routeIpParts = routeIp.split("\\.");String[] dstIpParts = dstIp.split("\\.");int matchLen = 0;for (int i = 0; i < routeIpParts.length; i++) {int routePart = Integer.parseInt(routeIpParts[i]);int dstPart = Integer.parseInt(dstIpParts[i]);int commonPrefix = Integer.numberOfLeadingZeros(routePart ^ dstPart);matchLen += commonPrefix;if (commonPrefix < 8) {break;}}if (matchLen >= maskLen && matchLen > maxMatchLen) {maxMatchLen = matchLen;longestRoute = routeIp + "/" + maskLen;}}return longestRoute;}

输出结果

192.168.0.1/24Process finished with exit code 0

这篇关于【HUAWEI OJ 题库】路由表最长匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/593119

相关文章

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

hihocoder1050 : 树中的最长路

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一棵二叉树!还可以拼凑成一棵多叉树——好吧,其实就是更为平常的树而已。 但是不管怎么说,小Ho喜爱的玩具又升级换代了,于是他更加爱不释手(其实说起来小球和木棍有什么好玩的是吧= =)。小Ho手

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

计蒜客 Skiing 最长路

In this winter holiday, Bob has a plan for skiing at the mountain resort. This ski resort has MM different ski paths and NN different flags situated at those turning points. The ii-th path from the