https://atcoder.jp/contests/abc247/tasks/abc247_b
match m.get(&k.to_string()) { Some(n) => { let n1 = n + 1; m.insert(k.to_string(), n1) } None => m.insert(k.to_string(), 1) };
は、entryを使ってこう書けるんですね。
let e = m.entry(k.to_string()).or_insert_with(|| 0); *e += 1
値じゃなくてclosureを使わないといけないみたいです。
// Unique Nicknames #![allow(non_snake_case)] use std::collections::HashMap; fn read<T: std::str::FromStr>() -> T { let mut line = String::new(); std::io::stdin().read_line(&mut line).ok(); line.trim().parse().ok().unwrap() } fn read_vec<T: std::str::FromStr>() -> Vec<T> { read::<String>().split_whitespace() .map(|e| e.parse().ok().unwrap()).collect() } fn count(k: &String, m: &mut HashMap<String,i32>) { let e = m.entry(k.to_string()).or_insert_with(|| 0); *e += 1 } fn is_all_unique_nickname(names: &Vec<(String,String)>) -> bool { let mut m = HashMap::<String,i32>::new(); for (s, t) in names.iter() { count(&s, &mut m); count(&t, &mut m); } for (s, t) in names.iter() { if s == t { if m[s] != 2 { return false } } else { if m[s] != 1 && m[t] != 1 { return false } } } return true } fn main() { let N: usize = read(); let mut names = Vec::<(String,String)>::new(); for _ in 0..N { let v: Vec<String> = read_vec(); names.push((v[0].to_string(), v[1].to_string())) } let b = is_all_unique_nickname(&names); println!("{}", if b { "Yes" } else { "No" }); }