AtCoder Beginner Contest 247 B(2)

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