Description

Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or phrase. For example, you can call the University of Waterloo by dialing the memorable TUT-GLOP. Sometimes only part of the number is used to spell a word. When you get back to your hotel tonight you can order a pizza from Gino's by dialing 310-GINO. Another way to make a telephone number memorable is to group the digits in a memorable way. You could order your pizza from Pizza Hut by calling their ``three tens'' number 3-10-10-10.        
The standard form of a telephone number is seven decimal digits with a hyphen between the third and fourth digits (e.g. 888-1200). The keypad of a phone supplies the mapping of letters to numbers, as follows:        
A, B, and C map to 2 D, E, and F map to 3 G, H, and I map to 4 J, K, and L map to 5 M, N, and O map to 6 P, R, and S map to 7 T, U, and V map to 8 W, X, and Y map to 9
There is no mapping for Q or Z. Hyphens are not dialed, and can be added and removed as necessary. The standard form of TUT-GLOP is 888-4567, the standard form of 310-GINO is 310-4466, and the standard form of 3-10-10-10 is 310-1010.        
Two telephone numbers are equivalent if they have the same standard form. (They dial the same number.)        
Your company is compiling a directory of telephone numbers from local businesses. As part of the quality control process you want to check that no two (or more) businesses in the directory have the same telephone number.        
 
 

Input

The input will consist of one case. The first line of the input specifies the number of telephone numbers in the directory (up to 100,000) as a positive integer alone on the line. The remaining lines list the telephone numbers in the directory, with each number alone on a line. Each telephone number consists of a string composed of decimal digits, uppercase letters (excluding Q and Z) and hyphens. Exactly seven of the characters in the string will be digits or letters.       
 
 

Output

Generate a line of output for each telephone number that appears more than once in any form. The line should give the telephone number in standard form, followed by a space, followed by the number of times the telephone number appears in the directory. Arrange the output lines by telephone number in ascending lexicographical order. If there are no duplicates in the input print the line:        
No duplicates.        
 
 

Sample Input

12
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

Sample Output

310-1010 2
487-3279 4
888-4567 3 以下为超时代码,太繁琐了!!!
#include <iostream>
#include <string>
using namespace std;
int f(char s[][],int x[],int y[],int n)
{
int q=,t,p,i,k,j;
for(i=;i<n-;i++){
if(s[i][]=='*')continue;
y[q]=;
for(k=i+;k<n;k++){
bool flag=true;
for(j=;j<;j++){
if(s[i][j]!=s[k][j]){
flag=false;
break;
}
}
if(flag==true){
s[k][]='*';
y[q]++;
}
}
if(y[q]>){
x[q]=i;
q++;
}
}
for(i=;i<q;i++){
for(j=;j<q-i-;j++)
for(p=;p<;p++){
if(s[x[j+]][p]>s[x[j]][p])break;
if(s[x[j+]][p]<s[x[j]][p]){
t=x[j];
x[j]=x[j+];
x[j+]=t;
t=y[j];
y[j]=y[j+];
y[j+]=t;
break;
}
}
}
return q;
}
int main()
{
int n,i,j,k=,x[],y[],q;
char s[][];
cin>>n;
while(k<n){
string str;
int a;
cin>>str;
a=str.length();
for(i=;i<a;i++){
if(str[i]=='-'){
for(j=i;j<a-;j++)str[j]=str[j+];
}
if(str[i]=='A'||str[i]=='B'||str[i]=='C')str[i]='';
if(str[i]=='D'||str[i]=='E'||str[i]=='F')str[i]='';
if(str[i]=='G'||str[i]=='H'||str[i]=='I')str[i]='';
if(str[i]=='J'||str[i]=='K'||str[i]=='L')str[i]='';
if(str[i]=='M'||str[i]=='N'||str[i]=='O')str[i]='';
if(str[i]=='P'||str[i]=='R'||str[i]=='S')str[i]='';
if(str[i]=='T'||str[i]=='U'||str[i]=='V')str[i]='';
if(str[i]=='W'||str[i]=='X'||str[i]=='Y')str[i]='';
if(i==){
str[i]='\0';
break;
}
}
for(i=;i<;i++)s[k][i]=str[i];
k++;
}
q=f(s,x,y,n);
for(i=;i<q;i++){
for(j=;j<;j++)cout<<s[x[i]][j];
cout<<'-';
for(j=;j<;j++)cout<<s[x[i]][j];
cout<<" "<<y[i]<<endl;
}
//system("pause");
return ;
}

不认真读题,n最大值为100000,上面定义s[100]!!!

修改几小时后!!

#include <iostream>
#include <string>
#include<stdlib.h>
using namespace std;
int temp[];
int comp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
int change(string str)
{
int a,b;
a=str.length();
for(int i=;i<a;i++){
if(str[i]=='-'){
for(int j=i;j<a-;j++)str[j]=str[j+];
}
switch(str[i]){
case 'A':
case 'B':
case 'C':str[i]='';break;
case 'D':
case 'E':
case 'F':str[i]='';break;
case 'G':
case 'H':
case 'I':str[i]='';break;
case 'J':
case 'K':
case 'L':str[i]='';break;
case 'M':
case 'N':
case 'O':str[i]='';break;
case 'P':
case 'R':
case 'S':str[i]='';break;
case 'T':
case 'U':
case 'V':str[i]='';break;
case 'W':
case 'X':
case 'Y':str[i]='';break;
}
if(i==){
str[i]='\0';
break;
}
}
b=(str[]-'')*+(str[]-'')*+(str[]-'')*+(str[]-'')*+(str[]-'')*+(str[]-'')*+(str[]-'');
return b;
}
int main()
{
int n,k=,a=,b=;
bool flag=false;
cin>>n;
while(k<n){
string str;
cin>>str;
temp[k]=change(str);
k++;
}
qsort(temp, n, sizeof(int),comp);
for(int i=;i<n;++i){
if(i+<n&&temp[a]==temp[i+])b++;
else{
if(b){
flag=true;
printf("%03d-%04d %d\n", temp[a]/, temp[a]%, b+);
b=;
}
a=i+;
}
}
if(!flag) printf("No duplicates. \n");
// system("pause");
return ;
}

然后是WA!!!!!快被自己蠢死了!
对比了一下正确代码与自己代码发现,我的代码是对输入字符串中存在7个数字或大写字母,超过7个,之后的数字或大写字母不计算到电话号码中。而正确的代码将所有数字或大写字母都计算在内,因此

在我的代码中 111111111和1111111111111111111是相同的电话号码

而正确代码中,两者是不同的!!!

这就是题目的缺陷,题目提到 输入的字符串中只有7个,但测试时必然有多于七个的字符串,才导致我的代码的结果错误。至少我研究了很久,是这样想的。

此题要注意到字符串与数字的转换,这样才可以运用快速排序,避免程序超时

然后正确代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int telenum[];
int comp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
int main()
{ int i, j, n, cnt, len, flag, low, sum;
char temp[];
char alphalist[] = "";
scanf("%d", &n);
for(i=; i<n; ++i)
{
scanf("%s", temp);
len = strlen(temp);
sum = ;
for(j= ; j<len; ++j)
{
if('' <= temp[j] && '' >= temp[j])
sum = sum* + (temp[j] - '');
else if('A'<= temp[j] && 'Z' >= temp[j])
sum = sum* + (alphalist[temp[j]-'A']-'');
}
telenum[i] = sum;
}
qsort(telenum, n, sizeof(int),comp);
low = cnt = flag = ;
for(i=; i<n; ++i)
{
if(i+ < n && telenum[low] == telenum[i+])
cnt++;
else
{
if(cnt)
{
flag = ;
printf("%03d-%04d %d\n", telenum[low]/, telenum[low]%, cnt+);
cnt = ;
}
low = i+;
}
}
if(!flag) printf("No duplicates.\n");
//system("pause");
return ;
}

A - 487-3279的更多相关文章

  1. 【枚举】POJ 3279

    直达–>POJ 3279 Fliptile 题意:poj的奶牛又开始作孽了,这回他一跺脚就会让上下左右的砖块翻转(1->0 || 0->1),问你最少踩哪些砖块才能让初始的砖块全部变 ...

  2. CODEVS 3279 奶牛的健美操

    3279 奶牛健美操 USACO  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description Farmer John为了保持奶牛们的 ...

  3. 【POJ 3279 Fliptile】开关问题,模拟

    题目链接:http://poj.org/problem?id=3279 题意:给定一个n*m的坐标方格,每个位置为黑色或白色.现有如下翻转规则:每翻转一个位置的颜色,与其四连通的位置都会被翻转,但注意 ...

  4. POJ 3279(Fliptile)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...

  5. POJ 3279 Fliptile[二进制状压DP]

    题目链接[http://poj.org/problem?id=3279] 题意:给出一个大小为M*N(1 ≤ M ≤ 15; 1 ≤ N ≤ 15) 的图,图中每个格子代表一个灯泡,mp[i][j] ...

  6. POJ 3279 - Fliptile - [状压+暴力枚举]

    题目链接:http://poj.org/problem?id=3279 Sample Input 4 4 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 Sample Output 0 ...

  7. POJ - 3279 Fliptile (枚举)

    http://poj.org/problem?id=3279 题意 一个m*n的01矩阵,每次翻转(x,y),那么它上下左右以及本身就会0变1,1变0,问把矩阵变成全0的,最小需要点击多少步,并输出最 ...

  8. POJ 3279 Fliptile(翻格子)

    POJ 3279 Fliptile(翻格子) Time Limit: 2000MS    Memory Limit: 65536K Description - 题目描述 Farmer John kno ...

  9. poj 3279 Fliptile(二进制)

    http://poj.org/problem?id=3279 在n*N的矩阵上,0代表白色,1代表黑色,每次选取一个点可以其颜色换过来,即白色变成黑色,黑色变成白色,而且其上下左右的点颜色也要交换,求 ...

  10. POJ 3279 Filptile dfs

    题目链接:http://poj.org/problem?id=3279 大意:给出一块n*m的棋盘.里面放满了棋子.有1和0两种状态.给出初始状态,翻动的时候会把当前位置和当前位置的上下左右共五个位置 ...

随机推荐

  1. Java Timer触发定时器

    XML: <!-- Java Timer定时 --> <!-- <bean id="shortUrlTask" class=" com.sprin ...

  2. Python3.5入门学习记录-模块

    模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用. 简单地说,模块就是一个保存了 ...

  3. Struts 2读书笔记-----Action访问Servlet API

    Action访问Servlet API Struts2中的Action并没有和任何Servlet API耦合,这样框架更具灵活性,更易测试. 对于Web应用的控制器而言,不访问ServletAPI是几 ...

  4. hdu3830 (二分+LCA)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Checkers Time Limit: 2000/1000 MS (Java/O ...

  5. ajax 传值 中文乱码问题

    使用encodeURI编码内容 var Path = encodeURI("中文.xls"); url: "ashx/Data.ashx?Path =" + P ...

  6. Python学习笔记(1)——数组差集

    面试的时候被问到这样一个问题:有A.B两个数组,找出B中有A中没有的所有元素(换言之即是求差集B-A).当时比较紧张,用了最原始的双重嵌套循环逐个比较,很显然这种时间复杂度高达O(n2)的算法相当lo ...

  7. Django学习之路

    Django Website Collect django packages http://djangopackages.com/ django project http://code.djangop ...

  8. SQL Server 查看空间使用情况的 5 种方法

    解决方法: 方法 1.sp_spaceused 方法 2.dbcc sqlperf 方法 3.dbcc showfilestats 方法 4.dbcc showcontig 方法 5.sys.dm_d ...

  9. Maven的使用--Eclipse在线安装Maven插件m2e

    我使用的Eclipse版本是3.7(Indigo) 通过Eclipse的help选项,点击“Install New Software...”弹出安装对话框, 点击add按钮,在Location里输入h ...

  10. OS-MAC: An Efficient MAC Protocol for Spectrum-Agile Wireless Networks

    IEEE TRANSACTIONS ON MOBILE COMPUTING, VOL. 7, NO. 8, AUGUST 2008 正如之前所说的,这是一个out-of-band local cove ...