二维数组上的数字为索引 即下一步要到的行数
如 先输入*dcef*
a | b | c | d | e | f | g | h | i | j | |
1 | 2 | |||||||||
2 | 3 | |||||||||
3 | 4 | |||||||||
4 | 5 | |||||||||
5 | ||||||||||
6 | ||||||||||
7 | ||||||||||
8 | ||||||||||
9 |
此时 sym[5]!=0
再输入*dcefa*
a | b | c | d | e | f | g | h | i | j | |
1 | 2 | |||||||||
2 | 3 | |||||||||
3 | 4 | |||||||||
4 | 5 | |||||||||
5 | 6 | |||||||||
6 | ||||||||||
7 | ||||||||||
8 | ||||||||||
9 |
当k=5时 判断sym【5】!=0成立 flag=1;同时增加一个6
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e5+7;
const int M=55;
int tree[N][M];
int sym[N];
int tot;
int flag;
struct node
{
char s[55];
int len;
}c[N];
bool cmp(node a,node b)
{
return a.len<b.len;
}
void insert(char s[])
{
int len=strlen(s);
int k=1;
for(int i=0;i<len;i++)
{
int temp=s[i]-'0';
if(!tree[k][temp])
tree[k][temp]=++tot;
k=tree[k][temp];
if(sym[k]!=0)
flag=1;
}
sym[k]=1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
memset(tree,0,sizeof(tree));
memset(sym,0,sizeof(sym));
flag=0;
tot=1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",c[i].s);
c[i].len=strlen(c[i].s);
}
sort(c+1,c+1+n,cmp);
for(int i=1;i<=n;i++)
{
insert(c[i].s);
if(flag==1)
{
printf("NO\n");
break;
}
}
if(flag==0)
printf("YES\n");
}
return 0;
}