初看起來,這道題很簡單,我以為很快能搞定,結果花了兩個晚上。其實是處理字符串不熟練,加上犯些比較白癡又不容易看出來的小錯誤,排序總出問題,好不容易出了樣例的正確結果,一提交,結果TLE。qsort,sort我都基本不會用,還好,有5isoft同志的熱心幫忙,把排序搞定了,然后再處理一下累計次數(shù),就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)//這個方法是曾經(jīng)聽lzm同學的思想,代碼是自己實現(xiàn)的
        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;
        }