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