以下の内容はhttps://inamori.hateblo.jp/entry/2025/03/31/203108より取得しました。


AtCoder Beginner Contest 399 D

https://atcoder.jp/contests/abc399/tasks/abc399_d

Aの隣同士のペアが2回出てくればだいたいよいです。

// Switch Seats
#![allow(non_snake_case)]


//////////////////// library ////////////////////

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 read_query() -> Vec<usize> {
    let _N: usize = read();
    let A: Vec<usize> = read_vec();
    A
}

use std::collections::{HashSet, HashMap};
use std::cmp::{min, max};

type Pair = (usize, usize);

fn collect_same_neighbors(A: &Vec<usize>) -> HashSet<usize> {
    let mut s: HashSet<usize> = HashSet::new();
    for (&a, &b) in A.iter().zip(A.iter().skip(1)) {
        if a == b {
            s.insert(a);
        }
    }
    s
}

fn F_each(A: Vec<usize>) -> usize {
    let N = A.len() / 2;
    let mut pairs: HashMap<Pair, usize> = HashMap::new();
    let mut used: Vec<i32> = vec![0; N+1];
    used[A[0]] = 1;
    for i in 0..N*2-1 {
        used[A[i+1]] += 1;
        if used[A[i]] != used[A[i+1]] {
            continue
        }
        let pair = (min(A[i], A[i+1]), max(A[i+1], A[i]));
        if A[i] == A[i+1] {
            continue
        }
        let e = pairs.entry(pair).or_insert(0);
        (*e) += 1
    }
    
    let neis = collect_same_neighbors(&A);
    let mut counter: usize = 0;
    for ((a, b), num) in pairs {
        if a != b && num == 2 && !neis.contains(&a) && !neis.contains(&b) {
            counter += 1
        }
    }
    counter
}

fn F(T: usize) {
    for _ in 0..T {
        let A = read_query();
        println!("{}", F_each(A.clone()))
    }
}

fn main() {
    let T: usize = read();
    F(T)
}



以上の内容はhttps://inamori.hateblo.jp/entry/2025/03/31/203108より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14