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," "); } };