( ̄y▽ ̄)~ 智能手机II

时间:2023-03-09 04:13:44
( ̄y▽ ̄)~ 智能手机II

( ̄y▽ ̄)~ 智能手机II

TimeLimit: 3000/1000 MS (Java/Others)  MenoryLimit: 32768/32768 K (Java/Others)
64-bit integer IO format:%I64d
Problem Description
在我们的手机通讯录中,我们可以通过输入手机号码时,搜索都联系人。如果当我们输入的手机号码正好也是另外一个手机号码的部分前缀时,同样会显示,前缀为这个手机号码的人的信息。只有当你输入的号码是唯一的,也就是输入的号码不是其他号码的前缀,,才会唯一的显示一个人的信息。 
比如: 
1. LhBoy 911 
2. bobo 10086 
3. hzz 10010 
当你输入其中任何一个人的号码时,都只会唯一的显示一个人的信息的、 
如果这个通讯录多增加一组:4. Orz 1001011 ,则,当你输入10010的时候,所查找到的联系人有hzz和Orz。 
现在问题来了,给你一个通讯录,问你在通过手机号码查询时,所查询出来的联系人的信息是否唯一,唯一的话输出YES,否则输出NO。 
*内存超限的话,就尝试着释放内存把( ̄y▽ ̄)~~
Input
第一行输入一个整数T,表示有T(1 <= t <= 40)组测试案例。 
每一组测试案例先输入一个整数N( 1 <= n <= 10000),表示通讯录有N条信息。 
接下来有N行,每一行表示各个联系人的电话号码,每一个电话号码最多10位数。
Output
For each test case, output “YES” if the list is consistent, or “NO” otherwise.
SampleInput
2
3
811
87625999
81125426
5
113
12340
123440
10086
98346
SampleOutput
NO
YES 解法:
大同小异,用字典树做,如果用的是链式的字典树还需要释放内存空间,用数组形式的字典数就不需要、
代码:
 #include <stdio.h>
#include <stdlib.h>
#include <string.h> using namespace std;
typedef struct Trie
{
struct Trie*Node[];
int num;
}Trie_Node;
Trie_Node*Head; Trie_Node* New_Node()
{
Trie_Node*H;
int i;
H=(Trie_Node*)malloc(sizeof(Trie_Node));
for(i=;i<=;i++)
H->Node[i]=NULL;
H->num=;
return H;
} void Free(Trie_Node* a)
{
if(a==NULL) return ; //释放内存
else
{
for(int i=;i<;i++)
Free(a->Node[i]);
}
free(a);
}
int Insert_Trie(char STR[])
{
Trie_Node *t;
Trie_Node *h=Head;
int i,Len=strlen(STR),SIGN,j=;
for(i=;i<Len;i++)
{
SIGN=STR[i]-'';
if(h->Node[SIGN]==NULL)
{
t=New_Node();
h->Node[SIGN]=t;
j=;
}
h=h->Node[SIGN];
if(h->num){j=;break;}
if(i==Len-)h->num=;
}
return j;
}
int main()
{
int T,N,i,j,SIGN;
char STR[];
scanf("%d",&T);
while(T--)
{
Head=New_Node();
scanf("%d",&N);
SIGN=;
for(i=;i<N;i++)
{
scanf(" %s",STR);
j=Insert_Trie(STR);
if(j==)SIGN=;
}
if(SIGN)printf("NO\n");
else printf("YES\n");
Free(Head);
}
return ;
}