2009-05-18
SRM354 Div1 Easy: DateFormat
300点問題。
- split(), map_atoi()は自作
- 今回 join() を書いた。最初にdateList[]を結合する時と、最後に答えをスペース区切りで繋げる時の合計2回使ってる
- 210.82points (20'22''), passed system test
typedef vector<int> vi;
typedef vector<string> vs;
#define pb push_back
#define tr(c,i) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++)
#define sz(a) int((a).size())
#define rep(var,n) for(int var=0;var<(n);var++)
#define all(c) (c).begin(),(c).end()
string join(vector<string> strs, const string &delim="")
{
int n=strs.size(); if (n==0) return "";
stringstream ss;
ss << strs[0];
for(int i=1;i<n;i++) { ss << delim << strs[i]; }
return ss.str();
}
class DateFormat {
public:
string fromEuropeanToUs(vector <string> dateList) {
vs dates = split(join(dateList)); int n=sz(dates);
vs mins(n), maxs(n);
vi ds; int lastd=0;
rep(i,n){
vi ns=map_atoi(split(dates[i],'/'));
if(ns[0]<ns[1]){ // xX
if (ns[1]<=12) { // mD, dM
int d1=ns[0]*100 + ns[1], d2=ns[1]*100+ns[0];
if(lastd < d1) { ds.pb(d1); lastd = d1; }
else if(lastd < d2) { ds.pb(d2); lastd = d2; }
else return "";
} else { // mD
int d=ns[0]*100 + ns[1];
if(lastd<d) { ds.pb(d); lastd = d; }
else return "";
}
}else if(ns[0]==ns[1]) { // md, <=12
int d=ns[0]*101;
if(lastd<d) { ds.pb(d); lastd = d; }
else return "";
}else{ //Xx
if (ns[0]<=12) { // Md, Dm
int d1=ns[1]*100 + ns[0], d2=ns[0]*100+ns[1];
if(lastd < d1) { ds.pb(d1); lastd = d1; }
else if(lastd < d2) { ds.pb(d2); lastd = d2; }
else return "";
} else { // Dm
int d=ns[1]*100 + ns[0];
if(lastd<d) { ds.pb(d); lastd = d; }
else return "";
}
}
}
vs anss;
rep(i,n){
char buf[6];
sprintf(buf,"%02d/%02d",ds[i]/100,ds[i]%100);
anss.pb(buf);
}
return join(anss," ");
}
};
コメント
トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20090518