数据结构编程题:Phone List

news/2024/12/22 16:25:07/

题目描述

Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let’s say the phone catalogue listed these numbers:

段落大意:给定一组电话号码,判断它们是否一致,即没有一个号码是另一个号码的前缀。假设电话目录列出了以下号码:

Emergency 911

Alice 97 625 999

Bob 91 12 54 26

In the case, it’s not possible to call Bob, because the central would direct your call to the emergency line as soon as you had dialed the first three digits of bob’s phone number. So this list would not be sonsistent.

段落大意:在这种情况下,不可能拨打Bob的电话,因为只要你拨打Bob电话号码的前三位,中心就会立即将你的呼叫转接到紧急线。因此,这个列表就不一致。

输入

The first line of input gives a single integer, 1<=t<=40, the number of test cases. Each test starts with n, the number of phone numbers, on a separate line, 1<=n<=10000. Then follows n linss with one unique phone numbers on each line. A phone number is a sequence of at most ten digits.

段落大意:第一行输入一个整数,1<=t<=40,表示测试用例的数量。每个测试用例以一个单独的行n开始,表示电话号码的数量,1<=n<=10000。然后是n行,每行包含一个唯一的电话号码。电话号码是最多包含十位数字的序列。

输出

For each test case, output “YES” if the list is consistent, or “NO” otherwise.

段落大意:对于每个测试用例,如果列表一致,则输出“YES”,否则输出“NO”

输入样例 1 

2
3
911
97625999
91125426
5
113
12340
123440
12345
98346

输出样例 1

NO
YES

实现

本题采用Trie树思路

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PHONE_LENGTH 11
typedef struct TrieNode {struct TrieNode* children[10];int isEndOfWord;
} TrieNode;
TrieNode* createTrieNode() {TrieNode* node = (TrieNode*)malloc(sizeof(TrieNode));for (int i = 0; i < 10; ++i) {node->children[i] = NULL;}node->isEndOfWord = 0;return node;
}
int insertPhoneNumber(TrieNode* root, const char* phoneNumber) {TrieNode* current = root;for (int i = 0; i < strlen(phoneNumber); ++i) {int index = phoneNumber[i] - '0';if (current->children[index] == NULL) {current->children[index] = createTrieNode();}current = current->children[index];if (current->isEndOfWord) {return 0;}}current->isEndOfWord = 1;for (int i = 0; i < 10; ++i) {if (current->children[i] != NULL) {return 0;}}return 1;
}
void freeTrie(TrieNode* root) {if (root == NULL) return;for (int i = 0; i < 10; ++i) {freeTrie(root->children[i]);}free(root);
}
int main() {int t;scanf("%d", &t);while (t--) {int n;scanf("%d", &n);TrieNode* root = createTrieNode();int consistent = 1;for (int i = 0; i < n; ++i) {char phoneNumber[MAX_PHONE_LENGTH];scanf("%s", phoneNumber);if (!consistent) {continue;}consistent = insertPhoneNumber(root, phoneNumber);}printf("%s\n",consistent?"YES":"NO");freeTrie(root);}return 0;
}


http://www.ppmy.cn/news/1330922.html

相关文章

Node.JS CreateWriteStream(大容量写入文件流优化)

Why I Need Node.JS Stream 如果你的程序收到以下错误&#xff0c;或者需要大容量写入很多内容(几十几百MB甚至GB级别)&#xff0c;则必须使用Stream文件流甚至更高级的技术。 Error: EMFILE, too many open files 业务场景&#xff0c;我们有一个IntradayMissingRecord的补…

【Go学习】Ginkgo测试框架学习实践 + 问题记录 + 怎么解决(0)

1、ginkgo测试框架介绍&#xff1a;https://onsi.github.io/ginkgo/ 2、重点是学习实践 问题记录 怎么解决 3、送福利&#xff1a;国内好用的ChatGpt有很多&#xff0c;比如&#xff1a;天工、文心一言、讯飞星火、通义万相等 1. 安装 xxxmacdeMacBook-Pro-3  /Volumes/mac…

51单片机8*8点阵屏

8*8点阵屏 8*8点阵屏是一种LED显示屏&#xff0c;它由8行和8列的LED灯组成。每个LED灯的开闭状态都可以独立控制&#xff0c;从而可以显示出数字、字母、符号、图形等信息。 8*8点阵屏的原理是通过行列扫描的方式&#xff0c;控制LED灯的亮灭&#xff0c;从而显示出所需的图案或…

阶乘分解《算法竞赛进阶指南》

阶乘分解《算法竞赛进阶指南》 \Huge{阶乘分解《算法竞赛进阶指南》} 阶乘分解《算法竞赛进阶指南》 题目地址&#xff1a;197. 阶乘分解 - AcWing题库 文章目录 题面输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a;样例解释 思路标程 题面 给定整数 N N…

上位机图像处理和嵌入式模块部署(windows opencv)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 opencv可以运行在多个平台上面&#xff0c;当然windows平台也不意外。目前来说&#xff0c;opencv使用已经非常方便了&#xff0c;如果不想自己编译…

【心得】java从CC1链入门CC链个人笔记

来劲了&#xff0c;感觉离真正的CTF又近了一步。 本文仅从一个萌新的角度去谈&#xff0c;如有纰漏&#xff0c;纯属蒟蒻。 目录 CC链概念 CC链学习前置知识 CC1链 Version1 Version2 Version3 CC链概念 CC链 Commons Collections apache组织发布的开源库 里面主要对…

数据库:逻辑删除|物理删除及适用性

物理删除和逻辑删除是两种不同的记录删除操作方式&#xff0c;它们各自具有一些优劣势&#xff0c;并适用于不同的场景。 物理删除 物理删除的优势&#xff1a; 节省存储空间&#xff1a;物理删除会直接从数据库中删除记录&#xff0c;可以实现即时的存储空间释放&#xff0c…

2024.1.20

今天主要是以复习为主&#xff0c;以前写过的C语言代码和高数&#xff0c;就在后天&#xff0c;紧张刺激的高数考试就来了&#xff0c;还是有点小慌…… #define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h> #i…