先按长度排序,先先插入长的,在插入的时候同时进行查询。
<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef struct
{
char str[12];
}P;
P p[200000];
bool cmp(P p1,P p2)
{
if(strlen(p1.str)>strlen(p2.str))
return true;
return false;
}
typedef struct
{
int cnt;
int next[11];
}N;
N node[200000];
int top;
int insert(char *str)
{
int len=strlen(str);
int t=0;
for(int i=0;i<len;i++)
{
if(node[t].next[str[i]-'0']==0)
node[t].next[str[i]-'0']=++top;
t=node[t].next[str[i]-'0'];
if(i==len-1&&node[t].cnt==1)
return 0;
node[t].cnt=1;
}
return 1;
}
char str[1100][12];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(node,0,sizeof(node));
top=0;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",&p[i].str);
int i;
sort(p,p+n,cmp);
for(i=0;i<n;i++)
{
if(insert(p[i].str)==0)
{
printf("NO\n");
break;
}
}
if(i>=n)
printf("YES\n");
}
return 0;
}
</span>