hdu 1671 Phone List(二叉树)

来源:互联网 发布:2017淘宝网下载 编辑:程序博客网 时间:2024/06/04 19:52

题目连接:hdu 1671 Phone List


题目大意:给出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);}elseinsert(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);}elseinsert(top, tmp);}}printf("%s\n", flag ? "NO" : "YES");del(top);}return 0;}


原创粉丝点击