JOI2006模擬試験2 問題3@C++(51)

mapとかstringとかoperatorのoverload使うあたりあまり好きじゃないがこのアプローチが妥当

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

using namespace std;

class ltstr
{
public:
	bool operator()(const string& s1, const string& s2) const
	{
		if(s1.size()==s2.size()) return (s1<s2);
		return s1.size()<s2.size();
	}
};

int main(int argc,char* argv[])
{
	map<string,int,ltstr> name_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);
		string sname=name;
		name_map[sname]+=num;
	}
	for(map<string,int,ltstr>::iterator i=name_map.begin();i!=name_map.end();++i) {
		printf("%s %d\n",i->first.c_str(),i->second);
	}
	return 0;
}