kmjp's blog

競技プログラミング参加記です

2015-2016 ACM-ICPC NEERC : A. Email Aliases

本番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ネタだね。