POJ1002 487-3279 WA了好几回 TUT
2013-10-09 20:48
344 查看
1002题描述了为了便于记忆,经常将电话号码(数字)转换成英文字母,由于英文字母和数字是多对一的关系,因此不同的表示可能代表的是同一个电话号码,此题给一定个数的电话号码,要求将任何号码转换成统一的格式,统计同样的号码出现的次数,如果转换后有相同的号码,按照XXX-XXXX的格式输出7位数字,后面跟上出现次数,如果没有重读的,则输出No duplicates.
我想说此题真是坑啊,巨坑!花了我两天时间才找到为啥错了,思想方法倒不难,先读入数据转换成数字字符串存入,然后排序,最后统计输出。但是数据量太大,开始开的数组大小为100001*9的,一提交就是WA、WA。我急了,测试的数据全都过了,几经周折,找到了原题的测试数据,当输入12个、甚至1000个程序都没有问题,统计结果仍然相同,但是都数据量到达10万的时候,就会出现错误,测试了几组10W个的数据,错误都在我统计结果的最后几十条。终于,想到了是不是我数组开小了,换成101000*9后,果然自己机器上跑的结果终于正确了。
但是!我拿这个程序提交时,竟然又是WA,真是觉得见鬼了,后来换成C编译器才好了。真是奇怪,我自己就是用的GCC编译器,提交就是WA,最后再将数组开到110000*9后终于GCC也过了,对此我觉得是不是我用的的GCC的版本问题,是不是编译器优化过了,相比poj上的编译器效率更高呢?
我想说此题真是坑啊,巨坑!花了我两天时间才找到为啥错了,思想方法倒不难,先读入数据转换成数字字符串存入,然后排序,最后统计输出。但是数据量太大,开始开的数组大小为100001*9的,一提交就是WA、WA。我急了,测试的数据全都过了,几经周折,找到了原题的测试数据,当输入12个、甚至1000个程序都没有问题,统计结果仍然相同,但是都数据量到达10万的时候,就会出现错误,测试了几组10W个的数据,错误都在我统计结果的最后几十条。终于,想到了是不是我数组开小了,换成101000*9后,果然自己机器上跑的结果终于正确了。
但是!我拿这个程序提交时,竟然又是WA,真是觉得见鬼了,后来换成C编译器才好了。真是奇怪,我自己就是用的GCC编译器,提交就是WA,最后再将数组开到110000*9后终于GCC也过了,对此我觉得是不是我用的的GCC的版本问题,是不是编译器优化过了,相比poj上的编译器效率更高呢?
#include<stdio.h> #include<string.h> #include<stdlib.h> int strComp(const void *a, const void *b){ return strcmp((char*)a, (char *)b); } void main(){ int number,i=0,j,m,count=0,l,flag=0; char s[100]; char c[101000][9]; int p[101000]; memset(c,'\0',sizeof(c)); scanf("%d",&number); while( count < number && number<=100000){ memset(s,'\0',sizeof(s)); scanf("%s",s); getchar(); l=strlen(s); for(j=0,m=0;m<l;m++){ if(j==3){ c[i][j]='-'; j++; } if(s[m] == '-') continue; if(s[m]>=65 && s[m]<90){ switch(s[m]){ case 'A': case 'B': case 'C': c[i][j]='2';break; case 'D': case 'E': case 'F': c[i][j]='3';break; case 'G': case 'H': case 'I': c[i][j]='4';break; case 'J': case 'K': case 'L': c[i][j]='5';break; case 'M': case 'N': case 'O': c[i][j]='6';break; case 'P': case 'R': case 'S': c[i][j]='7';break; case 'T': case 'U': case 'V': c[i][j]='8';break; case 'W': case 'X': case 'Y': c[i][j]='9';break; default: break; } } else{ c[i][j]=s[m]; } j++; } i++; count++; } qsort(c[0],number,9,strComp); memset(p,0,number); for(i=0;i<number-1;i++){ m=i; p[i]++; while(strcmp(c[i],c[i+1])==0){ p[m]++; flag=1; i++; } if(flag==1){ printf("%s %d\n",c[i-1],p[m]); flag=2; } } if(flag==0) printf("No duplicates.\n"); }
相关文章推荐
- Qt 方向盘实现
- 关于window.location.href is not a function在FF,chrom报错问题
- 【Cocos2d-x】Win7+ vs2012,2010 + Cocos2d-x2.2 配置Cocos2d-X项目-环境
- 迷茫
- 完美安装ubuntu
- 保险条款精解(四)索赔——不可不看,因为您以前可能没听说过
- hdu 4339 Query(单点更新+二分查找)
- 保险条款精解(三) 撞车
- C#引用类型和值类型的区别
- 保险条款精解(二) 丢车——如何将损失降到最低点?
- 教你榨干保险公司最后一滴血
- C++进阶——初始化列表
- TIME-WAIT状态
- smarty、thinkphp中的html加载其他的html文件的方式
- [LeetCode]Reverse Integer解题报告
- c++ typedef 函数指针的用法
- JVM 垃圾回收原理
- 共享池刷新及高速缓存
- 设计模式——门面模式
- hdu 4632 回文子序列计数