trie-字符串-电话号码问题

给定电话号码列表,确定其一致性,即没有号码是另一个号码的前缀。假设电话目录列出了以下号码:

紧急 911
爱丽丝 97 625 999
鲍勃 91 12 54 26
在这种情况下,无法致电 Bob,因为当您拨打 Bob 电话号码的前三位数字后,中心会立即将呼叫呼叫呼叫呼叫呼叫呼叫呼叫呼叫呼叫。因此,此列表不一致。

输入
第一行输入给出一个整数,1 + t = 40,测试用例数。每个测试用例以n开头,电话号码号在单独的线路上,1 = n = 10000。然后按照n行,每行上有一个唯一的电话号码。电话号码是最多十位数字的序列。

输出
对于每个测试用例,如果列表一致,则输出"YES"或"否"。

示例输入
2
3
911
97625999
91125426
5
113
12340
123440
12345
98346
样品输出
NO
YES
在这里插入图片描述

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
const int N=100010;
int son[N][15],cnt[N];
int idx;
char str[N][15];

void insert(char str[])
{
	int p=0;

	for(int i=0;str[i]!='\0';i++)
	{
		int u=str[i]-'0';
		if(son[p][u]==0)
			son[p][u]=++idx;
		p=son[p][u];
		cnt[p]++;
	}
}

int query(char str[])
{
	int p=0;
	for(int i=0;str[i]!='\0';i++)
	{
		int u=str[i]-'0';
		if(cnt[son[p][u]]==1)
		{
			return 0;
		}
		p=son[p][u];
	}
	return cnt[p];
}

int main()
{
	int t,n;
	cin>>t;
	while(t--)
	{
		idx=0;
		memset(son,0,sizeof(son));
		memset(cnt,0,sizeof(cnt));
		memset(str,0,sizeof(str)); 
		int i;
		cin>>n;
		for(i=0;i<n;i++)
		{
			scanf("%s",str[i]);
			insert(str[i]);
		}

		bool flag=1;
		for(i=0;i<n;i++)
		{
			if(query(str[i])>=2)
				flag=0;
		}
		cout<<(flag?"YES":"NO")<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值