到底买不买(PAT)

该篇博客主要介绍了如何解决一个珠子匹配问题,即判断店主提供的珠串是否包含并超过小红想要的珠串所需的所有珠子。通过使用哈希表统计每种颜色珠子的数量,判断并计算多余或缺失的珠子,最终确定购买决策。文章提供了详细的解题思路和C++代码实现。

到底买不买(PAT)

题目描述

小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如,YrR8RrY是小红想做的珠串;那么ppRYYGrrYBR2258可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;ppRYYGrrYB225不能买,因为没有黑色珠子,并且少了一颗红色的珠子。

输入描述:

每个输入包含1个测试用例。每个测试用例分别在2行中先后给出摊主的珠串和小红想做的珠串,两串都不超过1000个珠子。

输出描述:

如果可以买,则在一行中输出“Yes”以及有多少多余的珠子;如果不可以买,则在一行中输出“No”以及缺了多少珠子。其间以1个空格分隔。

输入例子:
ppRYYGrrYBR2258
YrR8RrY
输出例子:
Yes 8
题意:

  给定两个字符串,分别用不同的字符代表不同颜色的珠子,字符出现的次数代表珠子的数量。问串1是否都包含了串2所出现的字符以及对应的数量,若是输出Yes,并输出多余字符数量。反之输出No,并输出缺少的字符数量。

解题思路:

  使用Hash,将串1出现的各字符对应的数量进行累加存储。遍历串2,减去串2出现的各字符数量。若Hash表内存在负数,则说明店家给的珠子缺少一部分,输出No,反之输出Yes。而数组总体距离0的差值即为缺少或多余的珠子数量。

源代码:
#include <iostream>
#include <string>

using namespace std;

const int N = 257;

int Num[N]; 			//Hash存储各类珠子数目(以字符表示珠子颜色,字符取值0-256,故开数组257) 

int main()
{
	
	string  Str1;		//店主给的珠串 
	cin >> Str1;
	
	//遍历摊主给的珠串,统计各类珠子数目 
	for(int i = 0; i < Str1.size(); i++) {
		Num[Str1[i]]++;			//对应珠子种类+1 
	}
	
	string Str2;		//小红要的珠串
	cin >> Str2;
	
	//遍历小红想要的珠串,每个珠子数目-1,若为负数,则缺少,若为非负数,则满足小红要求珠子条件 
	for(int i = 0; i < Str2.size(); i++) {
		Num[Str2[i]]--;			//对应珠子种类的数目-1 
	}
	
	int neg = 0;	//总负数珠子数目 - 缺失数目 
	int pos = 0;	//总正数珠子数目 - 多余数目
	
	for(int i = 0; i <= 256; i++) 
		if(Num[i] < 0) neg += Num[i];			//统计缺少珠子 
		else if(Num[i] > 0) pos += Num[i];		//统计多余珠子 
	
	neg = -neg;			//负数转正 
	//判断是否缺少珠子,输出结果 
	if(neg) cout << "No " << neg;
	else cout << "Yes " << pos;
	
	return 0;
} 

若对于上述解法存有疑问,欢迎各位大佬评论区指出!本新人博主将和大家一起参与讨论学习!

### PAT 映射与配置概述 PAT(Port Address Translation,端口地址转换),也称为 NAPT(Network Address Port Translation),是一种扩展 NAT 的技术。它仅能够完成 IP 地址的转换,还能在同一时间对多个内部私有地址共享同一个外部公共 IP 地址进行通信[^4]。 在实际应用中,PAT 使用同的端口号来区分来自同内部设备的数据流。这意味着即使多个内部机使用相同的源 IP 地址访问外部网络,它们也可以通过唯一的端口号区分开来。这种机制显著提高了公共 IP 地址的利用效率,并减少了对外部 IP 地址的需求[^4]。 以下是关于如何配置 PAT 的具体方法: --- ### 配置 PAT 的步骤说明 #### 1. 启用 NAT 功能 在网络设备上启用 NAT 是第一步操作。通常情况下,这可以通过全局命令 `ip nat` 来实现。例如,在 Cisco 路由器中,可以执行如下命令: ```shell Router(config)# ip nat inside source list ACL interface GigabitEthernet0/0 overload ``` 这条命令的作用是将匹配 ACL(访问控制列表)中的所有内部私有地址映射到指定接口上的单个公共 IP 地址,并允许端口重载(overload)。这里的 `GigabitEthernet0/0` 表示出口接口[^5]。 #### 2. 定义内外网区域 为了正确实施 NAT/PAT,需要定义哪些接口属于内网(inside),哪些属于外网(outside)。这是通过设置接口属性完成的: ```shell Router(config-if)# ip nat inside Router(config-if)# ip nat outside ``` #### 3. 创建访问控制列表 (ACL) 创建一个标准或扩展的 ACL,用来规定哪些流量应该参与 NAT 或者 PAT 过程。例如: ```shell Router(config)# access-list 1 permit 192.168.1.0 0.0.0.255 ``` 该语句表示允许子网 `192.168.1.0/24` 中的所有流量触发 NAT 转换过程。 #### 4. 应用 NAT 到特定接口 最后一步就是把前面准备好的 ACL 和 NAT 规则绑定在一起并应用于合适的物理接口之上。如前所述的例子所示,我们已经完成了这一部分工作。 --- ### 实际案例分析 假设有一个小型企业网络环境,其中包含以下组件: - **内部网络**: 子网为 `192.168.1.0/24` - **外部连接**: 单独的一个 WAN 接口拥有公网 IP 地址 `203.0.113.1` 在这种场景下,管理员希望所有的内部用户都能通过这个单一的公网 IP 访问互联网资源。此时就可以采用 PAT 技术解决这个问题。按照前述流程依次配置好之后,整个企业的员工都可以正常上网而无需额外购更多的公网 IP 地址。 --- ### 注意事项 尽管 PAT 提供了一种经济高效的解决方案,但也存在一些潜在缺点需要注意: - 可能会增加防火墙和路由器处理负担; - 对某些特殊应用程序可能造成兼容性问题,特别是那些依赖固定端口的应用程序[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值