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