电话薄

本文介绍了一个电话簿号码冲突检测的问题及解决方案。通过构建特定的数据结构,可以高效地判断电话簿中的号码是否会发生自动拨号冲突,即是否存在一个号码是另一个号码前缀的情况。

电话薄

Time Limit:10000MS  Memory Limit:65536K
Case Time Limit:1000MS

Description

何老板的手机很先进,当要拨打一个号码时,你需敲出该号码的前面几个数字,手机就会自动找出以该数字为前缀的所有号码。 
比如下列电话薄: 
TOM:1388 
JIM:13885599999 
LEE:13812345678 
TEC:0236588888 
如果何老板敲了138三个数字,手机屏幕上就会显示TOM、JIM和LEE的名字。很是方便呀! 

但是何老板发现有不好的地方就是比如他想拨打JIM的号码,当他在手机上敲了1388这四个数字,没等何老板敲完其它数字,手机就会自动拨打TOM的号码,这让何老板很是烦恼。也就是说一旦手机发现你当前敲出的数字与电话薄中的某个号码匹配了,它就会自动拨打该号码。 

于是何老板想知道,他的电话薄中,也就是是否存在一个号码是其它号码的前缀的情况。 

Input

第一行,一个整数t,表示有t组测试数据1 ≤ t ≤ 40 
对于每组测试数据: 
第一行一个整数n(1 ≤ n ≤ 10000),表示电话薄中有n个号码 
接下来n行,每行一个数字,表示一个电话号码,每个电话号码的长度不超过10,并且是唯一的。

Output

每组测试数据输出一行,如果有有号码是其它号码的前缀,输出"NO"否则输出"YES"

Sample Input

2
4
1388
13885599999
13812345678
0236588888
5
113
12340
123440
12345
98346

Sample Output

NO
YES

Source

改编自Nordic 2007 poj3630


#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 20009
struct node{bool used, haveson;int next[11];}trie[maxn*10];
int tot=1;
void _solve()
{
	int n, i, p, len;
	bool flag=1;
	char phone[20];
	scanf("%d", &n);
	while(n--)
	{
		scanf("%s", phone);
		p=1;
		len=strlen(phone);
		for(int i=0; i<len; i++)
		{
			int t=phone[i]-'0';
			trie[p].haveson=true;
			if(trie[p].next[t]==0)
			{
				tot++;
				trie[p].next[t]=tot;
				p=trie[p].next[t];
			}
			else
			{
				
				p=trie[p].next[t];
				if(trie[p].used)	flag=0;
			}
		}
		trie[p].used=true;
		if(trie[p].haveson)
		{
			flag=0;
		}
	}
	if(flag)	printf("YES");
	else printf("NO");
	putchar('\n');
	
}
int main()
{
	int t;
	scanf("%d", &t);
	while(t--)
	{
		_solve();
		for(int i=1; i<=tot; i++)
		{
			trie[i].haveson=trie[i].used=0;
			for(int j=0; j<11; j++)	trie[i].next[j]=0;
		}
		tot=1;
	}
	return 0;
}




### 电话簿功能实现概述 电话簿是一种常见的数据管理工具,用于存储和管理联系人信息。根据提供的引用内容[^1],Python可以用来实现一个简单的电话簿功能,而引用内容[^2]和[^3]则展示了如何使用Java语言实现电话簿的功能。以下是基于Python的电话簿功能实现示例代码。 ```python # Python 实现电话簿功能 class Contact: def __init__(self, name, phone, email="", address=""): self.name = name self.phone = phone self.email = email self.address = address class PhoneBook: def __init__(self): self.contacts = [] def add_contact(self, contact): self.contacts.append(contact) print(f"联系人 {contact.name} 已添加到电话簿中。") def search_contact(self, name): for contact in self.contacts: if contact.name == name: return contact return None def delete_contact(self, name): for i, contact in enumerate(self.contacts): if contact.name == name: del self.contacts[i] print(f"联系人 {name} 已从电话簿中删除。") return print(f"未找到名为 {name} 的联系人。") def display_contacts(self): if not self.contacts: print("电话簿为空。") else: for contact in self.contacts: print(f"姓名: {contact.name}, 电话: {contact.phone}, 邮箱: {contact.email}, 地址: {contact.address}") # 主程序逻辑 def main(): phone_book = PhoneBook() while True: print("\n1. 添加联系人\n2. 查找联系人\n3. 删除联系人\n4. 显示所有联系人\n5. 退出") choice = input("请选择操作: ") if choice == "1": name = input("请输入姓名: ") phone = input("请输入电话号码: ") email = input("请输入邮箱 (可选): ") address = input("请输入地址 (可选): ") contact = Contact(name, phone, email, address) phone_book.add_contact(contact) elif choice == "2": name = input("请输入要查找的联系人姓名: ") contact = phone_book.search_contact(name) if contact: print(f"姓名: {contact.name}, 电话: {contact.phone}, 邮箱: {contact.email}, 地址: {contact.address}") else: print(f"未找到名为 {name} 的联系人。") elif choice == "3": name = input("请输入要删除的联系人姓名: ") phone_book.delete_contact(name) elif choice == "4": phone_book.display_contacts() elif choice == "5": print("感谢使用电话簿程序!再见!") break else: print("无效的选择,请重新输入。") if __name__ == "__main__": main() ``` 上述代码实现了电话簿的基本功能,包括添加、查找、删除和显示联系人信息。此外,还可以进一步扩展功能,例如支持更复杂的搜索条件或对联系人进行排序[^1]。 在Java中,电话簿功能可以通过类似的方式实现。引用内容[^3]提供了一个Java版本的电话簿主界面实现,其中包含了添加、删除、查询和退出等功能。通过结合`NoteService`类中的具体方法,可以实现完整的电话簿功能。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值