PKU 1002 计数排序

题意:输入N个(0<=N<=10000)电话号码,输入只包括0-9,A-Z(除Q、Z)和连字符,其中A-Z的26字母除Q与Z分别对应相应一位数字。按字典序输出出现次数大于2的电话号码标准形式(即全部由数字组成并且3、4位有一个连字符)与出现次数。如果没有次数大于2的电话号码输出“No duplicate!”。注意这里电话号码标准形式7位数字。

分析:简单字符串处理与排序。数据规模比较大,一般的排序很可能超时。这里采用空间换时间的计数排序,字母数字转换采用哈希表。

 

C++源码

#include <stdio.h> const int N = 10000000; unsigned int times[N]; int main() { int num; // talbe[]="ABCDEFGHIGKLMNOPQRSTUVWXYZ" char table[]="22233344455566670778889990", s[128]; scanf("%d", &num); for(int i=0;i<num;i++){ scanf("%s", s); int sum = 0; for(int j=0;s[j]!='/0';j++){ if(s[j]>='A' && s[j]<='Z') sum = sum*10 + table[(int)(s[j]-'A')]-'0'; else if(s[j]>='0' && s[j]<='9') sum = sum*10 + s[j]-'0'; } times[sum]++; } int f=0; for(int i=0;i<N;i++){ if(times[i]>=2){ f=1; printf("%03d-%04d %d/n", i/10000,i%10000,times[i]); } } if(f==0) printf("No duplicates./n"); return 0; }

你可能感兴趣的:(PKU 1002 计数排序)