https://atcoder.jp/contests/abc381/tasks/abc381_d
前から見て行って、1122の間だけ整数と位置の辞書を作って、1122でなくなったら辞書を削除して、同じ整数が出たらそこから前まで辞書から消します。
// 1122 Substring #![allow(non_snake_case)] use std::collections::HashMap; //////////////////// 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_input() -> Vec<i32> { let _N: usize = read(); let A: Vec<i32> = read_vec(); A } fn F(A: Vec<i32>) -> usize { let N = A.len(); let mut max_length: usize = 0; let mut start_pos: usize = 0; let mut dic_pos: HashMap<i32, usize> = HashMap::new(); for i in 0..N { if (i - start_pos) % 2 != 0 { if A[i-1] == A[i] { match dic_pos.get(&A[i]) { Some(&k) => { dic_pos.insert(A[i], i-1); for p in (start_pos..k).step_by(2) { dic_pos.remove(&A[p]); } start_pos = k + 2 }, None => { dic_pos.insert(A[i], i-1); let length = i - start_pos + 1; if length > max_length { max_length = length } } } } else { start_pos = i; dic_pos.clear() } } else { if i > 0 && A[i-1] == A[i] { start_pos = i - 1; dic_pos.clear(); dic_pos.insert(A[i], i-1); } } } max_length } fn main() { let A = read_input(); println!("{}", F(A)) }