complete 2800.rs
This commit is contained in:
77
storage/zeta/rs/completed/2800.rs
Normal file
77
storage/zeta/rs/completed/2800.rs
Normal file
@@ -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<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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user