use std::cmp::min; use std::io::stdin; fn left_binary_search(arr: &Vec, 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 = 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![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)); }