| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
实在没办法了,谁帮我看看我的为什么WA我的代码是字符串保存完整形式的电话号码,以平衡二叉树结构存储不同的号码结点,以便快速查找和插入,我的查找函数就是插入函数,自测100000 条输入运行时间不超过0.3s,随机样本,一直没有发现哪里有问题,但提交总是WA, 谁帮我看一下,万分感谢了
GCC 代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TELEPHONE_LEN 10
#define MAX(a, b) ((a) > (b) ? (a) : (b))
struct telephone_num_s
{
char telephone[TELEPHONE_LEN];
int count;
int depth;
struct telephone_num_s *left;
struct telephone_num_s *right;
};
char *format_telephone_num(char *input, char *telephone)
{
int i = 0;
int j = 0;
int len = strlen(input);
memset(telephone, 0, TELEPHONE_LEN);
for(i = 0; i < len && j < TELEPHONE_LEN; i++)
{
switch(input[i])
{
case '0':
case '1':
telephone[j] = input[i];
break;
case 'A':
case 'B':
case 'C':
case '2':
telephone[j] = '2';
break;
case 'D':
case 'E':
case 'F':
case '3':
telephone[j] = '3';
break;
case 'G':
case 'H':
case 'I':
case '4':
telephone[j] = '4';
break;
case 'J':
case 'K':
case 'L':
case '5':
telephone[j] = '5';
break;
case 'M':
case 'N':
case 'O':
case '6':
telephone[j] = '6';
break;
case 'P':
case 'R':
case 'S':
case '7':
telephone[j] = '7';
break;
case 'T':
case 'U':
case 'V':
case '8':
telephone[j] = '8';
break;
case 'W':
case 'X':
case 'Y':
case '9':
telephone[j] = '9';
break;
default:
break;
}
if(telephone[j])
{
j++;
}
if(j == 3)
{
telephone[j] = '-';
j++;
}
}
return telephone;
}
int get_tree_depth(struct telephone_num_s *num_list)
{
if(!num_list)
{
return 0;
}
return num_list->depth;
}
struct telephone_num_s *search_from_list(struct telephone_num_s *num_list, int *dup_count, char *telephone)
{
if(!num_list)
{
struct telephone_num_s *new_node = malloc(sizeof(struct telephone_num_s));
if(!new_node)
{
return NULL;
}
memset(new_node, 0, sizeof(struct telephone_num_s));
new_node->count = 1;
new_node->depth = 1;
strcpy(new_node->telephone, telephone);
return new_node;
}
else
{
int cmp = strcmp(num_list->telephone, telephone);
if(!cmp)
{
if(num_list->count == 1)
{
(*dup_count)++;
}
num_list->count++;
return num_list;
}
else if(cmp > 0)
{
if(!num_list->left)
{
struct telephone_num_s *new_node = malloc(sizeof(struct telephone_num_s));
if(!new_node)
{
return num_list;
}
memset(new_node, 0, sizeof(struct telephone_num_s));
new_node->count = 1;
new_node->depth = 1;
strcpy(new_node->telephone, telephone);
num_list->left = new_node;
if(num_list->depth < 2)
{
num_list->depth = 2;
}
return num_list;
}
else
{
struct telephone_num_s *tmp_node = search_from_list(num_list->left, dup_count, telephone);
int left_depth = get_tree_depth(tmp_node);
int right_depth = get_tree_depth(num_list->right);
if(left_depth >= right_depth+2)
{
struct telephone_num_s *left = tmp_node;
int ll_depth = get_tree_depth(left->left);
int lr_depth = get_tree_depth(left->right);
if(ll_depth > lr_depth)
{
num_list->left = left->right;
left->right = num_list;
int lr_depth = get_tree_depth(num_list->left);
num_list->depth = MAX(right_depth, lr_depth) + 1;
left->depth = MAX(ll_depth, num_list->depth) + 1;
num_list = left;
}
else
{
tmp_node = left->right;
left->right = tmp_node->left;
left->depth = MAX(ll_depth,
get_tree_depth(left->right)) + 1;
tmp_node->left = left;
num_list->left = tmp_node->right;
num_list->depth = MAX(right_depth, get_tree_depth(num_list->left)) + 1;
tmp_node->right = num_list;
tmp_node->depth = MAX(left->depth, num_list->depth) + 1;
num_list = tmp_node;
}
}
else
{
num_list->left = tmp_node;
if(num_list->depth - 1 < tmp_node->depth)
{
num_list->depth = tmp_node->depth + 1;
}
}
return num_list;
}
}
else
{
if(!num_list->right)
{
struct telephone_num_s *new_node = malloc(sizeof(struct telephone_num_s));
if(!new_node)
{
return num_list;
}
memset(new_node, 0, sizeof(struct telephone_num_s));
new_node->count = 1;
new_node->depth = 1;
strcpy(new_node->telephone, telephone);
num_list->right = new_node;
if(num_list->depth < 2)
{
num_list->depth = 2;
}
return num_list;
}
else
{
struct telephone_num_s *tmp_node = search_from_list(num_list->right, dup_count, telephone);
int right_depth = get_tree_depth(tmp_node);
int left_depth = get_tree_depth(num_list->right);
if(right_depth >= left_depth+2)
{
struct telephone_num_s *right = tmp_node;
int rr_depth = get_tree_depth(right->right);
int rl_depth = get_tree_depth(right->left);
if(rr_depth > rl_depth)
{
struct telephone_num_s *right_left = tmp_node->left;
num_list->right = right->left;
num_list->depth = MAX(left_depth, rl_depth) + 1;
right->left = num_list;
right->depth = MAX(num_list->depth, rr_depth) + 1;
num_list = right;
}
else
{
tmp_node = right->left;
right->left = tmp_node->right;
right->depth = MAX(rr_depth,
get_tree_depth(right->left)) + 1;
tmp_node->right = right;
num_list->right = tmp_node->left;
num_list->depth = MAX(left_depth,
get_tree_depth(num_list->right)) + 1;
tmp_node->left = num_list;
tmp_node->depth = MAX(right->depth, num_list->depth) + 1;
num_list = tmp_node;
}
}
else
{
num_list->right = tmp_node;
if(num_list->depth - 1 < tmp_node->depth)
{
num_list->depth = tmp_node->depth + 1;
}
}
return num_list;
}
}
}
}
void call_back(struct telephone_num_s *num_list)
{
if(num_list->count > 1)
{
printf("%s %d\n", num_list->telephone, num_list->count);
}
return;
}
void traverse_telephone_tree(struct telephone_num_s *num_list, void (*call_back)(struct telephone_num_s *))
{
if(!num_list)
{
return;
}
else
{
traverse_telephone_tree(num_list->left, call_back);
call_back(num_list);
traverse_telephone_tree(num_list->right, call_back);
return;
}
}
int main()
{
int num = 0;
char inputline[32] = {0};
char *line = inputline;
struct telephone_num_s *num_list = NULL;
int index = 0;
int currlen = 0;
int dup_count = 0;
int input_count = 0;
scanf("%d", &num);
while(input_count < num)
{
char telephone[TELEPHONE_LEN] = {0};
scanf("%s", line);
format_telephone_num(line, telephone);
//printf("get telephone %s input count %d\n", telephone, input_count);
num_list = search_from_list(num_list, &dup_count, telephone);
input_count++;
memset(inputline, 0, 32);
}
if(dup_count == 0)
{
printf("No dumplicates.\n");
}
else
{
traverse_telephone_tree(num_list, call_back);
}
//printf("dup_count %d\n", dup_count);
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator