diff --git a/storage/zeta/rs/completed/2800.rs b/storage/zeta/rs/completed/2800.rs new file mode 100644 index 0000000..e9846ce --- /dev/null +++ b/storage/zeta/rs/completed/2800.rs @@ -0,0 +1,77 @@ +use std::{collections::HashSet, io::stdin, iter}; + +fn get_all_parenthesis_pairs(s: &String) -> Vec<(usize, usize)> { + let mut stack: Vec = vec![]; + + let mut parenthesis_pairs = vec![]; + + for (i, c) in s.chars().enumerate() { + if c == '(' { + stack.push(i); + } else if c == ')' { + let counter = stack.pop().unwrap(); + parenthesis_pairs.push((counter, i)); + } + } + + parenthesis_pairs +} + +fn filter_out(s: &Vec, mask: &Vec) -> String { + // mask is sorted + if mask.len() == 0 { + return s.iter().collect(); + } else { + let mut new_s = String::new(); + let n = s.len(); + let m = mask.len(); + let mut i = 0; + let mut j = 0; + while i < n { + let c = s[i]; + if j != m { + if i < mask[j] { + new_s.push(c); + } else if i == mask[j] { + j += 1; + } + } else { + new_s.push(c); + } + + i += 1; + } + new_s + } +} + +fn main() { + let mut s = String::new(); + stdin().read_line(&mut s).unwrap(); + s = s.trim().to_string(); + + let mut filtered_strings: HashSet = HashSet::new(); + + let pars = get_all_parenthesis_pairs(&s); + let n = pars.len(); + let vectored_s = s.chars().collect::>(); + + for i in 1..(1 << n) { + let mut mask = vec![]; + for (j, &(l, r)) in pars.iter().enumerate() { + if i & (1 << j) != 0 { + mask.push(l); + mask.push(r); + } + } + mask.sort(); + let new_s = filter_out(&vectored_s, &mask); + filtered_strings.insert(new_s); + } + let mut filtered_strings = filtered_strings.into_iter().collect::>(); + filtered_strings.sort(); + for s in filtered_strings { + println!("{}", s); + } + +}