atcoder-solutionsatcoder-solutions
abc471_f

Concat (maximize) の解説

abc471_f by @ohnuma

解説

fn main() { input! { n: usize, k: usize, mut s: [String; n] } s.sort_by(|a, b| { let aln = a.len(); let bln = b.len(); if aln != bln { return bln.cmp(&aln); } b.cmp(&a) }); let f = |mut s: Vec<String>| { s.sort_by(|a, b| { let aa = format!("{}{}", a, b); let bb = format!("{}{}", b, a); bb.cmp(&aa) }); s.concat() }; let ans1 = f(s[..k].to_owned()); let mut best = s[k - 1].parse::<usize>().unwrap(); for i in k..n { let num = s[i].parse::<usize>().unwrap(); best = max(best, num); } let mut cur = s[..k].to_vec(); cur.pop().unwrap(); cur.push(best.to_string()); let ans2 = f(cur); let mut ans1 = ans1.trim_start_matches("0"); let mut ans2 = ans2.trim_start_matches("0"); if ans1.is_empty() { ans1 = "0"; } if ans2.is_empty() { ans2 = "0"; } let ord = 'l: { if ans1.len() != ans2.len() { break 'l ans2.len().cmp(&ans1.len()); } ans2.cmp(&ans1) }; let ans = if ord == Ordering::Greater {ans2} else {ans1}; println!("{}", ans); }

コメント