Files
CodeObject/storage/zeta/rs/completed/2800.rs
2025-12-31 22:34:13 -08:00

78 lines
1.9 KiB
Rust

use std::{collections::HashSet, io::stdin, iter};
fn get_all_parenthesis_pairs(s: &String) -> Vec<(usize, usize)> {
let mut stack: Vec<usize> = 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<char>, mask: &Vec<usize>) -> 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<String> = HashSet::new();
let pars = get_all_parenthesis_pairs(&s);
let n = pars.len();
let vectored_s = s.chars().collect::<Vec<char>>();
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::<Vec<String>>();
filtered_strings.sort();
for s in filtered_strings {
println!("{}", s);
}
}