F - Transpose Editorial by ngtkana


対応する括弧の位置を前計算しておきます。(コード中の enclose

最も左から、右を向いてスタートして

  • 基本は向いている方向に進む
  • (, ) を踏むたびに対応する括弧にジャンプして、向いている方向を逆にする
  • 向いている方向が左のときだけ lowercase/uppercase を反転

というふうにすると、パースができます。詳しくはコードをぜひです。

提出:https://atcoder.jp/contests/abc350/submissions/52621112

use proconio::input;
use proconio::marker::Bytes;

fn main() {
    input! {
        s: Bytes
    }
    let mut enclose = vec![usize::MAX; s.len()];
    let mut stack = Vec::new();
    for (i, c) in s.iter().enumerate() {
        match c {
            b'(' => stack.push(i),
            b')' => {
                let j = stack.pop().unwrap();
                enclose[i] = j;
                enclose[j] = i;
            }
            _ => {}
        }
    }

    let mut ans = Vec::new();
    let mut rev = false;
    let mut i = 0;
    while i < s.len() {
        match s[i] {
            b'(' | b')' => {
                rev ^= true;
                i = enclose[i];
            }
            c => ans.push(if rev { c ^ 32 } else { c }),
        }
        if rev {
            i -= 1;
        } else {
            i += 1;
        }
    }
    let ans = String::from_utf8(ans).unwrap();
    println!("{}", ans);
}

posted:
last update: