BIT小学期-电话号码问题

news2024/11/13 10:11:15
Output

输出包括两个部分,第一个部分是错误的电话号码,对于这些号码应当按照输入的顺序以原始的形式输出。在输出错误电话号码前输出Error:,随后输出这些号码,如果没有错误的电话号码,则输出Not found.

第二部分是重复的正确的电话号码,对每一个在电话簿中以任何形式出现一次以上的电话号码,生成一行输出。这一行应以标准形式给出电话号码,其后跟随一个空格,空格后跟随电话号码在电话簿中出现的次数。所有重复的电话号码输出行应以号码的升序排列(小号码在前)。在输出重复电话号码前输出Duplication,随后按照上述格式输出号码,如果在输入中没有重复的电话号码,则输出:Not found.

Note

你所编写的程序以后可能会在一种特殊的嵌入式设备上运行,为了降低成本,这种设备使用的 CPU 不是很快、可用的 RAM 为 288K(跟 GBA 一样)且它没有磁盘设备因此不能使用文件作为数据的临时存储。

Hint

请参考《编程珠玑》第一部分,若程序不能在规定的内存中运行,则不得分

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 4873279↵
  2. ITS-EASY↵
  3. 666-4567↵
  4. 3-10-10-10↵
  5. 666-GLOP↵
  6. MON-GLOP↵
  7. 367-11-11↵
  8. 310-GINO↵
  9. F101010↵
  10. 666-1200↵
  11. -4-8-7-3-2-7-9↵
  12. 487-3279↵
以文本方式显示
  1. Error:↵
  2. 4873279↵
  3. ITS-EASY↵
  4. -4-8-7-3-2-7-9↵
  5. 487-3279↵
  6. Duplication:↵
  7. 310-1010 2↵
  8. 666-4567 3↵
1秒512KB0
测试用例 2以文本方式显示
  1. 3456789↵
以文本方式显示
  1. Error:↵
  2. Not found.↵
  3. Duplication:↵
  4. Not found.↵
1秒512KB0

电话号码合法性的判断和输出就不讲了,只要在到判断到非法时直接输出即可。

这道题由于这道题的内存卡得很死,所以在记录号码是否记录过时 用bitset,每 一个位 (0或1)记录一个号码的状态。又因为合法的号码必须是3或6,所以最多2000000个 bit 就能记录下所有合法号码的状态。0代表号码未访问过,1代表号码已经访问。

对于已经访问过的号码,就存入哈希表中,如果已经存入哈希表中了,那就将出现次数增加

这样存储的话:【 (2000000/8) + (4+2)*1505 + 4*21】/1024 = 253KB   再加上其他定义的一些int变量,这个空间也是完全够用的。

几个注意点:

1.用char [ ] 来获取输入字符串,而不是string,因为string会占用额外的空间

2.将字母与数字映射时,最好不要用map,可以写个switch函数来判断,虽然慢点,但是不占空间

3.在判断完是否合法后,不合法直接输出,合法的话,转换成int类型,因为继续用字符串保存的话占用空间更大。

4.对于排序:直接用sort,写一个cmp函数就行

#include <bits/stdc++.h>
using namespace std;

int dc = 0;
bitset<1000000> arr[2];

struct mymap {
    int num;
    short c;
} d[1505];

bool cmp(mymap a, mymap b) {
    return a.num < b.num;
}

int getNumber(char ch) {
    switch (ch) {
        case 'A': case 'B': case 'C':
            return 2;
        case 'D': case 'E': case 'F':
            return 3;
        case 'G': case 'H': case 'I':
            return 4;
        case 'J': case 'K': case 'L':
            return 5;
        case 'M': case 'N': case 'O':
            return 6;
        case 'P': case 'R': case 'S':
            return 7;
        case 'T': case 'U': case 'V':
            return 8;
        case 'W': case 'X': case 'Y':
            return 9;
        default:
            return -1; // 返回 -1 处理无效字符
    }
}

void insert(int a) {
    int pos = a % 1503;
    while(1){
        if (d[pos].num == 0 && d[pos].c == 0) {
            d[pos].num = a;
            d[pos].c = 2;
            dc++;
            return;
        } else if (d[pos].num == a) {
            d[pos].c++;
            return;
        } else {
            pos = (pos + 1) % 1503;
        }
    }
}

int main() {
    char temp[21];
    int num, len, begin, c, w;
    int i, flag = 0;
    printf("Error:\n");
    while (cin.getline(temp, 21)) {
        num = 0;
        len = strlen(temp);
        begin = 0;
        c = w = 0;
        if(temp[0]=='\0'){
            break;
        }
        // 去除前面的 '-'
        while (temp[begin] == '-') {
            begin++;
        }

        if (begin == len) {
            flag = 1;
            cout << temp << endl;
            continue;
        }

        if (temp[begin] == '3' || getNumber(temp[begin]) == 3) {
            w = 0;
        } else if (temp[begin] == '6' || getNumber(temp[begin]) == 6) {
            w = 1;
        }

        if (temp[begin] == '3' || getNumber(temp[begin]) == 3 ||
            temp[begin] == '6' || getNumber(temp[begin]) == 6) {
            for (i = begin + 1; i < len; i++) {
                if (temp[i] == '-') {
                    continue;
                } else {
                    c++;
                    if (temp[i] >= '0' && temp[i] <= '9') {
                        num = num * 10 + (temp[i] - '0');
                    } else {
                        int number = getNumber(temp[i]);
                        if (number >= 0 && number <= 9) {
                            num = num * 10 + number;
                        } else {
                            flag = 1;
                            cout << temp << endl;
                            break;
                        }
                    }
                }
            }
            if (i == len && c != 6) {
                flag = 1;
                cout << temp << endl;
                continue;
            }
            if (i == len) {
                if (arr[w].test(num)) {
                    insert((w + 1) * 3000000 + num);
                } else {
                    arr[w].set(num);
                }
            }
        } else {
            flag = 1;
            cout << temp << endl;
        }
    }

    if (flag == 0) {
        printf("Not found.\n");
    }
    printf("\nDuplication:\n");
    sort(d, d + 1505, cmp);
    for (int k = 1505 - dc; k < 1505; ++k) {
        printf("%03d-%04d %d\n", d[k].num / 10000, d[k].num % 10000, d[k].c);
    }
    if (dc == 0) {
        printf("Not found.\n");
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C++进阶]AVL树

前面我们说了二叉搜索树在极端条件下时间复杂度为O(n),本篇我们将介绍一种对二叉搜索树进行改进的树——AVL树 一、AVL 树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找效率低下。因此&#xff0c;两位…

6个Python小游戏项目源码【免费】

6个Python小游戏项目源码 源码下载地址&#xff1a; 6个Python小游戏项目源码 提取码: bfh3

深度学习Day-33:Semi-Supervised GAN理论与实战

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 一、 基础配置 语言环境&#xff1a;Python3.8编译器选择&#xff1a;Pycharm深度学习环境&#xff1a; torch1.12.1c…

cout无法正常显示中文

cout无法正常显示中文 虽然你使用了buf.length()来指定写入的字节数&#xff0c;但是在包含中文字符&#xff08;UTF-8编码下每个中文字符占用3个字节&#xff09;的情况下&#xff0c;直接使用length()可能不会正确反映实际的字节数&#xff0c;因为它给出的是字符数而非字节…

基于深度学习,通过病理切片直接预测HPV状态|文献速递·24-09-16

小罗碎碎念 有段时间没有写文献速递的推文了&#xff0c;搞得自己今天写还怪不适应的。 今天所有的推文&#xff0c;都是围绕一个系统的问题展开——既研究了HPV与EBV在头颈癌/鼻咽癌中的致病机制&#xff0c;也总结了如何结合病理组学直接由WSI预测HPV状态——没办法&#x…

变压器漏感对整流电路的影响

目录 1. 电压波形畸变 2. 输出电压波动 3. 电流纹波增加 4. 降低整流效率 5. 影响开关器件的性能 6. EMI&#xff08;电磁干扰&#xff09;增加 总结与应对措施 变压器漏感在整流电路中会产生一些影响&#xff0c;尤其在高频应用或电流变化较大的情况下&#xff0c;其影…

【GESP】C++一级练习BCQM3006,多行输出

多行输出练习题&#xff0c;使用cout或printf函数输出多行内容。 BCQM3006 题目要求 描述 在windows的控制台环境中所有的字符都是等宽的&#xff0c;默认情况下窗口中每行有 80 个字符&#xff0c;每个屏幕有 25 行&#xff0c;组成了一个字符矩阵。利用控制台的这个特点&a…

什么是 HTTP/3?下一代 Web 协议

毫无疑问&#xff0c;发展互联网底层的庞大协议基础设施是一项艰巨的任务。 HTTP 的下一个主要版本基于 QUIC 协议构建&#xff0c;并有望提供更好的性能和更高的安全性。 以下是 Web 应用程序开发人员需要了解的内容。 HTTP/3 的前景与风险 HTTP/3 致力于让互联网对每个人…

从登录到免登录:JSP与Servlet结合Cookie的基本实现

前言 JSP中应用Cookie解析&#xff1a; 用户登录成功后&#xff0c;将用户信息保存到Cookie中&#xff0c;在页面读取Cookie并显示&#xff0c;不需要再次登录可以直接进入页面 第一步&#xff1a;创建JavaWeb项目&#xff0c;配置pom.xml文件 创建maven项目&#xff0c;项目名…

背包问题 总结详解

就是感觉之前 dp 的 blog 太乱了整理一下。 0-1 背包 例题:P1048 朴素算法 思路 对于一个物品&#xff0c;我们可以选&#xff0c;也可以不选。 我们用表示第 i 件物品的重量&#xff0c;表示第 i 件物品的价值。 考虑表示前 i 件物品放入容量为j的背包中的最大价值。 如…

时间复杂度计算 递归(solve2 后续)

原帖 最近校内比较忙&#xff0c;更新缓慢&#xff0c;致歉。 这里函数每次都需要遍历 h h h 和 m m m 之间的数&#xff08;复杂度 O ( n ) O(n) O(n)&#xff09;&#xff0c;所以和 solve1 略有不同。仍然假设 T ⁡ ( n ) \operatorname{T}(n) T(n) 表示 m − h 1 n…

【C++二叉树】606.根据二叉树创建字符串

606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 图文分析&#xff1a; 代码实现&#xff1a; 代码说明&#xff1a; 1、前序遍历方式&#xff1a;根-左子树-右子树。 2、题目要求将二叉树转换为字符串输出&#xff0c;所以定义了一个string对象str。 3…

MySQL —— 视图

概念 视图是一张虚拟的表&#xff0c;它是基于一个或多个基本表或其他视图的查询结果集。 视图本身不存储数据&#xff0c;而是通过执行查询来动态生成数据&#xff0c;用户可以像操作普通表一样使用视图来进行查询更新与管理等操作。 视图本身也不占用物理存储空间&#xf…

网络安全学习(五)Burpsuite

经过测试&#xff0c;发现BP需要指定的JAVA才能安装。 需要的软件已经放在我的阿里云盘。 &#xff08;一&#xff09;需要下载Java SE 17.0.12(LTS) Java Downloads | Oracle 1.2023版Burp Suite 完美的运行脚本的环境是Java17 2.Java8不支持 看一下是否安装成功&#xff0c…

开源AI应用安全指导框架 — OWASP AI Exchange

在当今信息化迅猛发展的时代&#xff0c;网络专业人士正竞相提升人工智能&#xff08;AI&#xff09;安全领域的专业技能。随着这一趋势的推进&#xff0c;他们的企业也在快速地引入各类AI工具、平台、应用程序和服务&#xff0c;业界也相应涌现出众多资源&#xff0c;以协助从…

电梯电动车检测-目标检测数据集(包括VOC格式、YOLO格式)

电梯电动车检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1qRMdF08Jinx_5CRa3al24A?pwd3twc 提取码&#xff1a;3twc 数据集信息介绍&#xff1a; 共有 5347 张图像和一一对应的标注文件 …

web基础—dvwa靶场(五)File Upload

File Upload(文件上传) 上传的文件对 web 应用程序来说是一个巨大的风险&#xff0c;许多攻击的第一步是上传攻击代码到被攻击的系统上&#xff0c;然后攻击者只需要找到方法来执行代码即可完成攻击。也就是是说&#xff0c;文件上传是攻击者需要完成的第一步。 不受限制的文件…

c#中给winform定义快捷键的几种方式

快捷键的使用在日常的开发中频率比较高&#xff0c;这里总结了最常见的各种快捷键的设置方式&#xff0c;需要的时候大家直接照抄就可以了&#xff0c;不用再去查询如何实现了。 文章目录 一、按钮快捷键二、菜单快捷键三、窗体快捷键四、全局快捷键1、重写ProcessCmdKey2、使…

C++内存管理详解:各类变量的存储区域

在C中&#xff0c;变量的存储位置取决于它们的类型和生命周期。那么不同的各个变量究竟存储在哪个区域呢&#xff1f; 1.不同类型的变量 我们首先从变量类型的不同来说明&#xff1a; 1. 全局变量和静态变量 - 存储区&#xff1a;全局/静态区&#xff08;静态区&#xff0…

深度学习----------------------文本预处理

目录 文本预处理读取数据集词源化词表该部分总代码该部分总代码 整合所有功能该部分总代码 文本预处理 文本预处理&#xff1a;把文本当作一个时序序列 将解析文本的常见预处理步骤。 这些步骤通常包括&#xff1a; ①将文本作为字符串加载到内存中。 ②将字符串拆分为词元&…