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; } };