JOI2006模擬試験2 問題3@C++ lizanの指摘により書き直し(46)

#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;

class compare_query
{
public:
	bool operator()(const pair<string,int>& o1, const pair<string,int>& o2) const
	{
		const string& s1=o1.first;
		const string& s2=o2.first;
		if(s1.size()==s2.size()) return (s1<s2);
		return s1.size()<s2.size();
	}
};

int main(int argc,char* argv[])
{
	vector<pair<string,int> > query_map;
	int n;
	scanf("%d\n",&n);
	for(int i=0;i<n;i++) {
		char name[6];
		int num;
		scanf("%s %d\n",name,&num);
		query_map.push_back(pair<string,int>(name,num));
	}
	sort(query_map.begin(),query_map.end(),compare_query());
	string last_name="";
	int sum=0;
	for(vector<pair<string,int> >::iterator i=query_map.begin();i!=query_map.end();++i) {
		if(last_name==i->first) {
			sum+=i->second;
		} else {
			if(last_name.size()!=0) {
				printf("%s %d\n",last_name.c_str(),sum);
			}
			last_name=i->first;
			sum=i->second;
		}
	}
	if(last_name.size()!=0) {
		printf("%s %d\n",last_name.c_str(),sum);
	}
	return 0;
}

なるほど。まだまだ学ぶことは多そうだ。