F - Transpose Editorial by ngtkana


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

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

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

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

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

Copy
  1. use proconio::input;
  2. use proconio::marker::Bytes;
  3. fn main() {
  4. input! {
  5. s: Bytes
  6. }
  7. let mut enclose = vec![usize::MAX; s.len()];
  8. let mut stack = Vec::new();
  9. for (i, c) in s.iter().enumerate() {
  10. match c {
  11. b'(' => stack.push(i),
  12. b')' => {
  13. let j = stack.pop().unwrap();
  14. enclose[i] = j;
  15. enclose[j] = i;
  16. }
  17. _ => {}
  18. }
  19. }
  20. let mut ans = Vec::new();
  21. let mut rev = false;
  22. let mut i = 0;
  23. while i < s.len() {
  24. match s[i] {
  25. b'(' | b')' => {
  26. rev ^= true;
  27. i = enclose[i];
  28. }
  29. c => ans.push(if rev { c ^ 32 } else { c }),
  30. }
  31. if rev {
  32. i -= 1;
  33. } else {
  34. i += 1;
  35. }
  36. }
  37. let ans = String::from_utf8(ans).unwrap();
  38. println!("{}", ans);
  39. }
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:



2025-04-24 (Thu)
02:58:28 +00:00