初看起来,这道题很简单,我以为很快能搞定,结果花了两个晚上。其实是处理字符串不熟练,加上犯些比较白痴又不容易看出来的小错误,排序总出问题,好不容易出了样例的正确结果,一提交,结果TLE。qsort,sort我都基本不会用,还好,有5isoft同志的热心帮忙,把排序搞定了,然后再处理一下累计次数,就AC了。调程序调到脾气暴躁了,可怜了我的键盘啊……

未央C++博客
代码:

Source Code

Problem: 1002 User: wic
Memory: 1528K Time: 485MS
Language: C++ Result: Accepted
  • Source Code
    #include<iostream>
        #include<algorithm>
        #include<cstring>
        using namespace std;
        int map[25]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9};
        char a[100002][9];
        char b[9],c[50];
        int aa[100002];
        int comp(const void *p1, const void *p2)//快排的比较标准
        {
        return (strcmp(( char*)p1,(char*)p2));
        }
        int main()
        {
        int n,i,j=0,k=0,l,m;
        cin>>n;
        b[3]='-';
        for(j=0; j<n; j++){
        scanf("%s",c);
        l=strlen(c);
        m=0;
        for(i=0; i<l; i++){
        if(m==3)
        m++;
        if(c[i]<='9'&&c[i]>='0')
        b[m]=c[i];
        else if(c[i]<'Z'&&c[i]>='A')
        b[m]=map[c[i]-'A']+'0';
        else
        continue;
        m++;
        }
        strcpy(a[j],b);
        }
        qsort(a,n,9,comp);//最关键的排序
        for(i=0; i<n; i=k)//这个方法是曾经听lzm同学的思想,代码是自己实现的
        for(j=i+1; j<=n; j++){
        if(strcmp(a[i],a[j])==0)
        aa[i]++;
        else
        {	k=j;	break;}
        }
        int have=0;
        for(i=0; i<n; i++)
        if(aa[i]>0){
        printf("%s %d\n",a[i],aa[i]+1);
        have=1;
        }
        if(have==0)
        printf("No duplicates.\n");
        return 0;
        }