字典树 Phone List

Phone List

题目描述
给定 个长度不超过 的数字串,问其中是否存在两个数字串 ,使得 是 的前缀,多组数据。

输入格式
第一行一个整数 ,表示数据组数。
对于每组数据,第一行一个数 ,接下来 行输入 个数字串。

输出格式
对于每组数据,若存在两个数字串 ,,使得 是 的前缀,则输出 NO ,否则输出 YES 。
请注意此处结果与输出的对应关系!

样例
样例输入
2
3
911
97625999
91125426
5
113
12340
123440
12345
98346
样例输出
NO
YES

#include<stdio.h>
#include<string.h>
int tr[100003][30],f[100003]; //tr[]数组储存,f[]数组标记 
char s[30];
int t,n,tot;
int insert(){ //插入一个字符串并判断 
	int a=1,b,i,len=strlen(s),flag=0;
	for(i=0;i<len;i++){
		b=s[i]-'0';
		if(!tr[a][b])//如果从当前位置没有一条通向数字b的路
		    tr[a][b]=++tot;//创建一个新节点,并把这条边给记录
		else if(i==len-1)//如果从当前位置有一条通向数字b的路且当前单词已经结束
		    flag=1;   //说明这个单词是前面所输入单词其中几个的前缀
		a=tr[a][b];//令a等于当前节点所指向的节点
		if(f[a]) //如果当前节点所指向的节点位置是一个单词的尾部
		    flag=1;
	}
	f[a]=1;//把单词尾部标记为真 
	return flag;
}
int main(){	
	scanf("%d",&t);
	while(t--){
		memset(tr,0,sizeof(tr));
		memset(f,0,sizeof(f));
		int i,ans=0;
		tot=1;
		scanf("%d",&n);
		for(i=0;i<n;i++){
		    scanf("%s",s);
			if(insert())	
			    ans=1;
		}
		if(ans)
		    printf("NO\n");
		else
		    printf("YES\n");
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值