给定电话号码列表,确定其一致性,即没有号码是另一个号码的前缀。假设电话目录列出了以下号码:
紧急 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;
}