本番2時間だけ参加したところ、100名以上解いている問題は自力で解けた。(1問だけバグが時間内に取りきれなかった…)
http://codeforces.com/contest/589/problem/A
問題
複数のメールアドレスが与えられる。
以下の条件の元で、同じメールアドレスと判定できるメールアドレス群をグループ化せよ。
- 大文字小文字の差は無視される。
- ドメインがbmail.comの場合、@以前の文字列について、"."は無視される。また"+"から"@"までの文字列は無視される。
解法
メールアドレスを小文字化し、かつドメインがbmail.comの場合は"."と"+"を除いたうえでmultimapやmap+vectorで同一判定すればよい。
int N; string S[30303]; map<string,vector<int>> M; string conv(string s) { string login,domain; int x=s.find('@'); FORR(r,s) r=tolower(r); login = s.substr(0,x); domain = s.substr(x+1); if(domain!="bmail.com") return login+"@"+domain; string log2; FORR(r,login) { if(r=='.') continue; if(r=='+') break; log2+=r; } return log2+"@"+domain; } void solve() { int i,j,k,l,r,x,y; string s; cin>>N; FOR(i,N) { cin>>S[i]; M[conv(S[i])].push_back(i); } cout<<M.size()<<endl; FORR(r,M) { cout<<r.second.size(); FORR(r2,r.second) cout<<" "<<S[r2]; cout<<endl; } }
まとめ
gmailネタだね。