题目大意:给出n个电话号码,判断是否存在某个电话号码是另外一个电话号码的前缀。
解题思路:建一个二叉树进行搜索时的优化。
#include <stdio.h>
#include <string.h>
#define min(a,b) (a)<(b)?(a):(b)
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 tmp[]) {
int len = min(strlen(p->name), strlen(tmp));
if (strncmp(p->name, tmp, len) == 0) flag = 1;
else if (strcmp(p->name, tmp) > 0) {
if (p->l == NULL) {
p->l = new node;
strcpy(p->l->name, tmp);
}
else
insert(p->l, tmp);
}
else if (strcmp(p->name, tmp) < 0) {
if (p->r == NULL) {
p->r = new node;
strcpy(p->r->name, tmp);
}
else
insert(p->r, tmp);
}
}
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;
}