TopCoder SRM 353 Div1 Easy Glossary

問題

単語のリストが与えられる。
指定されたフォーマットの索引を作れ。


二段組で、左側に先頭の文字がA-Mのリストを、右側に先頭の文字がそれ以降のリストを書く。
左右の段組の間は2つのスペースをで区切る。

(その文字で始まる単語が存在するような)各文字ごとに

A
-------------------

を書いて、
単語をアルファベット順に並べて書く。
単語の先頭にはスペース2つ分のインデントを入れる。

制約条件

単語の数≦50
単語の長さ≦17

方針

定義にしたがって実装する。

ソースコード

char buf[2][100][100];
bool cmp(string a,string b){
	rep(i,a.size())a[i]=tolower(a[i]);
	rep(i,b.size())b[i]=tolower(b[i]);
	return a<b;
}
class Glossary {
	public:
	vector <string> buildGlossary(vector <string> items) 
	{
		memset(buf,0,sizeof(buf));
		int l=0,r=0;
		map<char,vs> m;
		rep(i,items.size()){
			char c=toupper(items[i][0]);
			m[c].pb(items[i]);
		}
		fr(i,m){
			sort(all(i->second),cmp);
			if(i->first<='M'){
				sprintf(buf[0][l++],"%c",i->first);
				sprintf(buf[0][l++],"-------------------");
				
				fr(j,(i->second)){
					string s="  "+*j;
					sprintf(buf[0][l++],"%s",s.c_str());
				}
			}
			else{
				sprintf(buf[1][r++],"%c",i->first);
				sprintf(buf[1][r++],"-------------------");
				
				fr(j,(i->second)){
					string s="  "+*j;
					sprintf(buf[1][r++],"%s",s.c_str());
				}
			}
		}
		vs ans;
		rep(i,max(l,r)){
			string s=buf[0][i],t=buf[1][i];
			while(s.size()<strlen("-------------------"))s.pb(' ');
			while(t.size()<strlen("-------------------"))t.pb(' ');
			s=s+"  "+t;
			ans.pb(s);
		}
		//rep(i,ans.size())cerr<<ans[i]<<endl;
		
		return ans;
	}
};