complete 1644.rs 2887.rs 15552.rs 24767.rs 25710.rs 34031.rs
This commit is contained in:
85
storage/zeta/rs/completed/34031.rs
Normal file
85
storage/zeta/rs/completed/34031.rs
Normal file
@@ -0,0 +1,85 @@
|
||||
use std::cmp::min;
|
||||
use std::io::stdin;
|
||||
|
||||
fn left_binary_search(arr: &Vec<i32>, target: i32) -> usize {
|
||||
let mut lo = 0;
|
||||
let mut hi = arr.len();
|
||||
|
||||
while lo < hi {
|
||||
let mid = lo + ((hi - lo) >> 1);
|
||||
|
||||
if arr[mid] >= target {
|
||||
hi = mid;
|
||||
} else {
|
||||
lo = mid + 1;
|
||||
}
|
||||
}
|
||||
|
||||
lo
|
||||
}
|
||||
|
||||
fn get_count_hightouch(s1: String, s2: String) -> i64 {
|
||||
let mut cnt: i64 = 0;
|
||||
|
||||
let mut cumulative_s1: Vec<i32> = Vec::new();
|
||||
|
||||
let mut before = 0;
|
||||
|
||||
for c in s1.chars() {
|
||||
if c == '(' {
|
||||
before += 1;
|
||||
} else {
|
||||
before -= 1;
|
||||
}
|
||||
if before < 0 {
|
||||
break;
|
||||
}
|
||||
// ())) 이래놓으면 할 수가 없음
|
||||
cumulative_s1.push(before);
|
||||
}
|
||||
|
||||
let mut cds: Vec<Vec<i32>> = vec![Vec::new(); 200001];
|
||||
|
||||
before = 0;
|
||||
let mut cum_min = 0;
|
||||
|
||||
for c in s2.chars() {
|
||||
if c == '(' {
|
||||
before += 1;
|
||||
} else {
|
||||
before -= 1;
|
||||
}
|
||||
|
||||
cum_min = min(before, cum_min);
|
||||
|
||||
if before > 0 {
|
||||
continue;
|
||||
} else {
|
||||
cds[(-before) as usize].push(cum_min);
|
||||
}
|
||||
}
|
||||
|
||||
for v in cds.iter_mut() {
|
||||
v.sort();
|
||||
}
|
||||
|
||||
for a in cumulative_s1.iter() {
|
||||
let mins = &cds[(*a) as usize];
|
||||
let append = (mins.len() - left_binary_search(mins, -a)) as i64;
|
||||
cnt += append;
|
||||
}
|
||||
|
||||
cnt
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let (mut s1, mut s2) = (String::new(), String::new());
|
||||
|
||||
stdin().read_line(&mut s1).unwrap();
|
||||
stdin().read_line(&mut s2).unwrap();
|
||||
|
||||
s1 = s1.trim().to_string();
|
||||
s2 = s2.trim().to_string();
|
||||
|
||||
println!("{}", get_count_hightouch(s1, s2));
|
||||
}
|
||||
Reference in New Issue
Block a user