`
shumo
  • 浏览: 9602 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

1002, TLE

    博客分类:
  • acm
阅读更多
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//#define __DEBUG
#define PHONESIZE 40
typedef struct _phone_stat {
	char phone[PHONESIZE];
	int count;
} phone_stat;

char CHAR_MAP[0x100];
int count;
int nitems = 0;

void charmap_init(void) {
	int i;
	for (i='0'; i<='9'; ++i) {
		CHAR_MAP[i] = i;
	}

	CHAR_MAP['A'] = '2';
	CHAR_MAP['B'] = '2';
	CHAR_MAP['C'] = '2';
	
	CHAR_MAP['D'] = '3';
	CHAR_MAP['E'] = '3';
	CHAR_MAP['F'] = '3';

	CHAR_MAP['G'] = '4';
	CHAR_MAP['H'] = '4';
	CHAR_MAP['I'] = '4';

	CHAR_MAP['J'] = '5';
	CHAR_MAP['K'] = '5';
	CHAR_MAP['L'] = '5';

	CHAR_MAP['M'] = '6';
	CHAR_MAP['N'] = '6';
	CHAR_MAP['O'] = '6';

	CHAR_MAP['P'] = '7';
	CHAR_MAP['R'] = '7';
	CHAR_MAP['S'] = '7';

	CHAR_MAP['T'] = '8';
	CHAR_MAP['U'] = '8';
	CHAR_MAP['V'] = '8';

	CHAR_MAP['W'] = '9';
	CHAR_MAP['X'] = '9';
	CHAR_MAP['Y'] = '9';

	CHAR_MAP['-'] = '-';
}

void convert(char *dest, char *src) {
	char c;
	int i = 0;
	int j = 0;
	int k = 0;
	while((c = src[i++]) != '\0') {
		char candy = CHAR_MAP[c];
		
		if (candy != '-') {
			dest[j++] = candy;
		}
		if (j == 3) {
			dest[j++] = '-';
		}
	}
	dest[j] = '\0';
}

void put(phone_stat **items, char *phone_buf) {
	int i;
	phone_stat *stat_p;
	char phone[PHONESIZE];
	convert(phone, phone_buf);
	for (i=0; i<count; ++i) {
		stat_p = items[i];
		if (!stat_p) {
			stat_p = (phone_stat *)malloc(sizeof(phone_stat));
			strcpy(stat_p->phone, phone);
			stat_p->count = 1;
			nitems++;
			items[i] = stat_p;
			return;
		} else if (strcmp(stat_p->phone, phone) == 0) {
			stat_p->count += 1;
			return;
		}
	}
}

#ifdef __DEBUG
char *input[] = {
	"4873279", 
	"ITS-EASY",
	"888-4567",
	"3-10-10-10",
	"888-GLOP",
	"TUT-GLOP",
	"967-11-11",
	"310-GINO",
	"F101010",
	"888-1200",
	"-4-8-7-3-2-7-9-",
	"487-3279"
};
count = 12;
#endif

int main(void) {	
	phone_stat *stat;
	phone_stat **items;
	phone_stat **gt1;
	int i, j;
	int size;
	int ngt1;
	
	charmap_init();

#ifndef __DEBUG
	scanf("%d", &count);
	if (count <= 0) {
		exit(1);
	}	
#endif

	size = sizeof(phone_stat *) * count;
	items = (phone_stat **)malloc(size);
	memset(items, 0, size);

	for (i=0; i<count; ++i) {
#ifndef __DEBUG
		char buf[PHONESIZE];			
		scanf("%s", buf);
		put(items, buf);
#else
		put(items, input[i]);
#endif
	}
	
	size = sizeof(phone_stat *) * nitems;
	gt1 = (phone_stat **)malloc(size);
	j = 0;
	for (i=0; i<nitems; ++i) {
		if (items[i]->count > 1) {
			gt1[j++] = items[i];	
		}
	}
	ngt1 = j;

	for (i=0; i<ngt1; ++i) {
		for (j=i+1; j<ngt1; ++j) {
			if (strcmp(gt1[i]->phone, gt1[j]->phone) > 0) {
				phone_stat *inter = gt1[i];
				gt1[i] = gt1[j];
				gt1[j] = inter;
			}
		}
		printf("%s %d\n", gt1[i]->phone, gt1[i]->count);
	}
	
	for (i=0; i<nitems; ++i) {
		free(items[i]);
	}
	free(items);
	free(gt1);
	
	return 0;
}

 TLE, 考,从这1001,1002两题都发现偶的代码写的太复杂了。需要改进啊,参考了别人的代码,改写成

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//#define __DEBUG
#define PHONESIZE 0x30
#define HTSIZE 10000000
char CHAR_MAP[0x100] = {127};
int count;
int nitems = 0;
unsigned char phone_hashtable[HTSIZE] = {0};

void charmap_init(void) {
	int i;
	for (i='0'; i<='9'; ++i) {
		CHAR_MAP[i] = i - '0';
	}
	CHAR_MAP['A'] = 2; CHAR_MAP['B'] = 2; CHAR_MAP['C'] = 2;	
	CHAR_MAP['D'] = 3; CHAR_MAP['E'] = 3; CHAR_MAP['F'] = 3;
	CHAR_MAP['G'] = 4; CHAR_MAP['H'] = 4; CHAR_MAP['I'] = 4;
	CHAR_MAP['J'] = 5; CHAR_MAP['K'] = 5; CHAR_MAP['L'] = 5;
	CHAR_MAP['M'] = 6; CHAR_MAP['N'] = 6; CHAR_MAP['O'] = 6;
	CHAR_MAP['P'] = 7; CHAR_MAP['R'] = 7; CHAR_MAP['S'] = 7;
	CHAR_MAP['T'] = 8; CHAR_MAP['U'] = 8; CHAR_MAP['V'] = 8;
	CHAR_MAP['W'] = 9; CHAR_MAP['X'] = 9; CHAR_MAP['Y'] = 9;
	CHAR_MAP['-'] = '-';
}

void convert(int *value, char *src) {
	char c;
	int val = 0;
	int i = 0;
	while((c = src[i++]) != '\0') {
		char candy = CHAR_MAP[c];
		if (candy >= 0 && candy < 10) {
			val *= 10;
			val += candy;
		}
	}
	*value = val;
}

void printNumber(int number, int count) {
	printf("%03d-%04d %d\n", number/10000, number % 10000, count); 
}

#ifdef __DEBUG
char *input[] = {
	"0000000",
	"000-0000",
	"010-0001",
	"4873279", 
	"ITS-EASY",
	"888-4567",
	"3-10-10-10",
	"888-GLOP",
	"TUT-GLOP",
	"967-11-11",
	"310-GINO",
	"F101010",
	"888-1200",
	"-4-8-7-3-2-7-9-",
	"487-3279"
};
count = 12;
#endif

int main(void) {
	int i;
	int has_dup = 0;
	charmap_init();

#ifndef __DEBUG
	scanf("%d", &count);
	if (count <= 0) {
		exit(1);
	}	
#endif

	for (i=0; i<count; ++i) {
		int value;
#ifndef __DEBUG
		char buf[PHONESIZE];
		scanf("%s", buf);
		convert(&value, buf);
#else
		convert(&value, input[i]);
#endif
		phone_hashtable[value] += 1;
	}

	for (i=0; i<HTSIZE; ++i) {
		if (phone_hashtable[i] > 1) {
			has_dup = 1;
			printNumber(i, phone_hashtable[i]);
		}
	}

	if (!has_dup) {
		printf("No duplicates.\n");
	}
	
	return 0;
}
 

变成WA, faint 了。

分享到:
评论

相关推荐

    TLE.rar_TLE_TLE KEPLER_boywah_coe2tle_tle2rv

    "TLE.rar_TLE_TLE KEPLER_boywah_coe2tle_tle2rv"这个压缩包文件所涉及的核心知识点,就是两行元素(Two Line Elements,简称TLE)以及与之相关的开普勒方程求解。TLE是一种简洁的格式,用于描述人造卫星的近似轨道...

    TLE5012B.zip_5012B_TLE5012B CSQ_tle5012b_tle5012b测速

    《TLE5012B测速系统与STM32 SPI接口编程详解》 TLE5012B是一款高性能的霍尔效应速度传感器,常用于汽车和其他工业应用中的速度测量。这款传感器以其高精度和稳定性著称,是许多工程师在设计速度检测系统时的首选。...

    cppOrbitTools.zip_CTLE 根数_tle c++_tle转六根数_tle转换_六根数

    在IT行业中,尤其是在航天和卫星轨道计算领域,`tle`(Two-Line Element Set)是一种广泛使用的格式,用于存储简化的卫星轨道数据。标题中的"cppOrbitTools.zip"是一个包含C++实现的库,用于处理与`tle`相关的任务,...

    TLE9255芯片手册

    ### TLE9255芯片知识点详解 #### 一、概述 TLE9255是一款高度集成的HS CAN收发器,具有部分网络功能,主要用于汽车和工业领域的高速CAN网络应用。该芯片的设计完全符合ISO 11898-2 (2016)标准,能够支持高达1Mbps的...

    TLED92108规格书

    TLED92108规格书 TLE92108-232QX是一款多MOSFET驱动IC,专门用于控制高达十六个n通道MOSFET。它包括八个半桥驱动器,用于DC电机控制应用,例如汽车座椅控制或其他应用。 功能特点 1. 八个半桥驱动器:TLE92108-...

    stm32f4+tle5012

    TLE5012则是一款磁编码器,常用于角度测量,例如在机器人、无人机、工业自动化等领域,能够提供精确的位置和速度信息。 在STM32F4与TLE5012的交互中,SPI(Serial Peripheral Interface)通信协议扮演着关键角色。...

    TLE5012-模拟SPIstm32f4与tle5012软件模拟spi通信,读取角度信息.rar

    标题中的"TLE5012"是一款磁位置传感器,常用于工业、汽车和机器人领域的角度检测。STM32F4是意法半导体公司生产的一款高性能的32位微控制器,广泛应用在嵌入式系统设计中。"模拟SPI"指的是通过软件编程实现SPI...

    TLE7242-2G.rar_HEQ_TLE7242-2G datasheet_TLE7242G_tle7242_变速箱

    **TLE7242-2G:电磁阀驱动IC详解** TLE7242-2G是一款专为车辆变速箱控制系统设计的电磁阀驱动集成电路。这款芯片在汽车电子领域中扮演着至关重要的角色,因为它能够精准地控制电磁阀的工作,从而确保变速器的平稳...

    tle_nnss33.com_cesium_卫星根数_TLE_

    tle_nnss33.com_cesium_卫星根数_TLE_ 是一个与卫星轨道数据处理相关的主题,主要涉及NNSS33.com网站、Cesium库以及TLE(Two-Line Element Set)卫星轨道根数。在IT行业中,特别是航天和地理信息系统(GIS)领域,...

    TLE6209调试记录.docx

    TLE6209作为一款集成驱动芯片,在直流电机的控制中发挥着核心作用。本文档详细记录了TLE6209调试的过程,以及在项目开发中的实际应用,为我们提供了一个可以直接使用的电路设计参考。 首先,TLE6209芯片采用SPI通信...

    TLE5012B.PDF

    TLE5012B芯片作为一款基于巨磁阻(GMR)效应的磁性角度传感器,以其高精度、高稳定性的特性,在多个行业中扮演了重要角色。本文将详细介绍TLE5012B的功能特性、应用场景、与控制器的集成方式以及如何利用多种通信协议...

    java_java读取TLE数据_TLE_轨道预测_卫星_SGP4

    TLE(Two-Line Element Set)是描述人造卫星轨道的一种简洁格式,它包含两行文本数据,这些数据可以用来计算卫星在地球轨道上的精确位置。在本项目中,我们将探讨如何使用Java语言来读取TLE数据,并利用SGP4...

    TLE7242驱动源码

    用CPU的16位SPI驱动恒电流控制芯片TLE7242的源码。

    TLE及程序由TLE到COE

    ### TLE及程序由TLE到COE #### 一、TLE简介 TLE(Two-Line Element Set)是一种广泛使用的格式,用于描述人造卫星在地球轨道上的位置和速度。这种格式是由美国的北美防空联合司令部(NORAD)所创建的。TLE数据包含...

    TLE5012 角度传感器 数据手册

    TLE5012是一种基于巨磁阻(GMR)技术的角位置传感器,它主要用于转子位置的检测,特别适用于三项电机的控制。TLE5012角度传感器的数据手册,版本号为V1.0,出版日期为2010年11月,由Infineon Technologies AG公司...

    TLE5012B寄存器手册

    TLE5012B资料,包含寄存器手册及部分应用原理

    TLE5012B绝对位置传感器

    **TLE5012B绝对位置传感器** TLE5012B是一款高精度、高性能的绝对位置传感器,常用于工业自动化、机器人控制、电机定位等应用领域。这款传感器能够提供连续的、非接触式的角度测量,其输出的数据包含了完整的360度...

    TLE数据时间修改软件

    本人用Qt开发的一个小软件,针对TLE格式的卫星轨道根数数据。可输入数据或加载数据文件,批量修改TLE数据对应的星历时刻,显示转换结果、导出数据等。软件可用于仿真中将处理好的TLE数据应用到其他时间段、合并多个...

    USER_SBC.zip_SBC_SBC-TLE9262配置函数_TLE9262_汽车_英飞凌SBC

    本文将详细探讨英飞凌SBC(System Basis Chip)TLE9262的配置函数,以及它在汽车应用中的重要性。 SBC,即系统基础芯片,是集成多种功能于一身的微控制器,通常包括电源管理、通信接口、模拟电路等,为系统提供必要...

    英飞凌TLE9261系列数据手册

    英飞凌的TLE9261系列是针对汽车电子应用设计的一款中端系统基础芯片(System Basis Chip,SBC),特别适用于车身控制系统。这款芯片集成了电压调节器、电源管理功能以及支持高速CAN(Controller Area Network)收发...

Global site tag (gtag.js) - Google Analytics