F - Transpose Editorial
by
ngtkana
対応する括弧の位置を前計算しておきます。(コード中の enclose
)
最も左から、右を向いてスタートして
- 基本は向いている方向に進む
(
,)
を踏むたびに対応する括弧にジャンプして、向いている方向を逆にする- 向いている方向が左のときだけ lowercase/uppercase を反転
というふうにすると、パースができます。詳しくはコードをぜひです。
提出:https://atcoder.jp/contests/abc350/submissions/52621112
Copy
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);
}
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: