AtCoder Beginner Contest 307 D

https://atcoder.jp/contests/abc307/tasks/abc307_d

(の位置をstackにpushして、)があればpopして、その位置まで削除します。

// Mismatched Parentheses
#![allow(non_snake_case)]


//////////////////// 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()
}


//////////////////// process ////////////////////

fn read_input() -> String {
    let _N: usize = read();
    let S: String = read();
    S
}

fn f(S: String) -> String {
    let mut stack: Vec<usize> = Vec::new();
    let mut cs: Vec<char> = Vec::new();
    for c in S.chars() {
        match c {
            '(' => { stack.push(cs.len()); cs.push(c) },
            ')' => match stack.pop() {
                    None    => cs.push(c),
                    Some(p) => for _ in p..cs.len() { cs.pop(); }
            },
            _ =>   cs.push(c)
        }
    }
    cs.into_iter().collect::<String>()
}

//////////////////// main ////////////////////

fn main() {
    let S = read_input();
    println!("{}", f(S))
}