AtCoder Beginner Contest 262 C

https://atcoder.jp/contests/abc262/tasks/abc262_c

インデックスと同じものと往復すると同じになるものを数えます。

// Min Max Pair
#![allow(non_snake_case)]

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()
}

//////////////////// process ////////////////////

fn F(A: Vec<usize>) -> usize {
    let N = A.len();
    let counter_same = (0..N).filter(|&i| A[i] == i + 1).count();
    let counter_swap = (0..N).filter(|&i| A[A[i]-1] == i + 1).count();
    return counter_same * (counter_same - 1) / 2 +
                        (counter_swap - counter_same) / 2
}

fn main() {
    let _N: usize = read();
    let A = read_vec();
    println!("{}", F(A))
}