题目大意:查找是否有重复前缀,利用BST查到遇到相同,即停止比较后续列表。
#include <stdio.h>
#include <string.h>
#define min(a,b) (a)>(b)?(b):(a)
const int N = 50;
int n, flag;
struct node{
char name[N];
node *l, *r;
node() {
memset(name, 0, sizeof(name));
l = r = NULL;
}
};
void del(node* p)
{
if(p->l != NULL)
del(p->l);
if(p->r != NULL)
del(p->r);
delete p;
}
void insert(node* p, char temp[])
{
int len = min(strlen(p->name), strlen(temp));
if(strncmp(p->name, temp, len) == 0)
flag = 1;
else if(strcmp(p->name, temp) > 0){
if(p->l == NULL){
p->l = new node;
strcpy(p->l->name, temp);
}
else
insert(p->l, temp);
}
else if(strcmp(p->name, temp) < 0){
if(p->r == NULL){
p->r = new node;
strcpy(p->r->name, temp);
} else
insert(p->r, temp);
}
}
int main()
{
int cas;
char tmp[N];
scanf("%d", &cas);
while(cas--){
node* top = NULL;
flag = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%s", tmp);
if(!flag){
if(top == NULL){
top = new node;
strcpy(top->name, tmp);
}
else
insert(top, tmp);
}
}
printf("%s\n", flag ? "NO" : "YES");
del(top);
}
return 0;
}