POJ1002 487-3279 WA了好几回 TUT

1002题描述了为了便于记忆,经常将电话号码(数字)转换成英文字母,由于英文字母和数字是多对一的关系,因此不同的表示可能代表的是同一个电话号码,此题给一定个
数的电话号码,要求将任何号码转换成统一的格式,统计同样的号码出现的次数,如果转换后有相同的号码,按照XXX-
XXXX的格式输出7位数字,后面跟上出现次数,如果没有重读的,则输出No duplicates.

我想说此题真是坑啊,巨坑!花了我两天时间才找到为啥错了,思想方法倒不难,先读入数据转换成数字字符串存入,然后排序,最后统计输出。但是数据量太大,开始开的数组
大小为1000019的,一提交就是WA、WA。我急了,测试的数据全都过了,几经周折,找到了原题的测试数据,当输入12个、甚至1000个程序都没有问题,统计
结果仍然相同,但是都数据量到达10万的时候,就会出现错误,测试了几组10W个的数据,错误都在我统计结果的最后几十条。终于,想到了是不是我数组开小了,换成10
1000
9后,果然自己机器上跑的结果终于正确了。

但是!我拿这个程序提交时,竟然又是WA,真是觉得见鬼了,后来换成C编译器才好了。真是奇怪,我自己就是用的GCC编译器,提交就是WA,最后再将数组开到1100
00*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");
}
您的支持将鼓励我继续创作!