abc447_c
Insert and Erase A の解説
解説 by @ohnuma
解説
まず、Aをフィルタした文字列同士で一致していなければS, Tを一致させることは不可能。
let ss = s.iter().filter(|&&e| e != 'A').collect_vec(); let tt = t.iter().filter(|&&e| e != 'A').collect_vec(); if ss != tt { return println!("-1"); }
そうでなければ、Aをこねくり回せば一致させることができる。
フィルタ後の配列に対して、その間にAを入れたり消したりして一致させる。
つまりは、フィルタあとの文字列がBCCという文字列だったら
ABACACA という文字で、S, TについてAのところに何個入っているかをカウントする配列を用意する。
これが用意できればそれらの差が出し入れする最小値になる。
fn main() { input! { s: Chars, t: Chars } let ss = s.iter().filter(|&&e| e != 'A').collect_vec(); let tt = t.iter().filter(|&&e| e != 'A').collect_vec(); if ss != tt { return println!("-1"); } let f = |v: &Vec<char>| { let mut acc = vec![]; let mut now = 0; for &c in v.iter() { if c == 'A' { now += 1usize; } else { acc.push(now); now = 0; } } acc.push(now); acc }; let sf = f(&s); let tf = f(&t); assert_eq!(sf.len(), tf.len()); let mut ans = 0; for i in 0..sf.len() { ans += sf[i].abs_diff(tf[i]); } println!("{}", ans); }