PKU 1002

風邪なおった。

#include <iostream>
#include <map>
#include <string>
int main(){
        using namespace std;
        int i, j, c, sz, n;
        string s;
        char r[9];
        map<string, int> m;
        cin>>n;
        for(i=0;i<n;i++){
                c=0;
                cin>>s;
                for(j=0,sz=s.size();j<sz;j++){
                        if(47<s[j]&&s[j]<58){r[c]=s[j];c++;continue;}
                        if(64<s[j]&&s[j]<81){r[c]=(s[j]-65)/3+50;c++;continue;}
                        if(81<s[j]&&s[j]<90){r[c]=(s[j]-66)/3+50;c++;continue;}
                }
                r[c]=0;
                m[r]++;
        }
        map<string, int>::iterator it = m.begin();
        while(it != m.end()){
                if(1 < (*it).second){
                        n = 0;
                        s=(*it).first;s.insert(3,"-");
                        cout<<s<<" "<<(*it).second<<endl;
                }
                ++it;
        }
        if(n) cout<<"No duplicates.";
}

問題文はこんな感じ 1002 487-3279 - PKU Wiki*

結構苦労しました。まだ削れる点はあると思いますがAcceptされるまでに結構労力を費したのでもういいやみたいな感じです。

ひっかかった点と対策は、

  1. まず問題文の"Q,Zにはキーが割り当てられていません。"を見落とす→Wrong Answer
  2. 出力にハイフン入れるのを見落とす(thx kyuridenamida!)→Wrong Answer
  3. vectorを使いながらのんびりバブルソート→Time Limit Exceeded→mapを使うようにして一気に数工程はぶく、というかC++初心者なのでmapの存在をよくは知らなかった
  4. ostringstreamが速度ボトルネック→Time Limit Exceeded→上のコードみたくcharにおしこめるように→やっとパス

みたいな感じです