20241114 finished.
This commit is contained in:
parent
a8b74b82a9
commit
081ff7b822
|
@ -312,3 +312,5 @@ mod p540_single_element_in_a_sorted_array;
|
|||
mod p1547_minimum_cost_to_cut_a_stick;
|
||||
|
||||
mod p3258_count_substrings_that_satisfy_k_constraint_i;
|
||||
|
||||
mod p3261_count_substrings_that_satisfy_k_constraint_ii;
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
/**
|
||||
* [3261] Count Substrings That Satisfy K-Constraint II
|
||||
*/
|
||||
pub struct Solution {}
|
||||
|
||||
// submission codes start here
|
||||
|
||||
impl Solution {
|
||||
pub fn count_k_constraint_substrings(s: String, k: i32, queries: Vec<Vec<i32>>) -> Vec<i64> {
|
||||
let s: Vec<u32> = s.chars().map(|x| x.to_digit(10).unwrap()).collect();
|
||||
let n = s.len();
|
||||
|
||||
let mut window = (0, 0);
|
||||
let mut right_array = vec![n; n];
|
||||
let mut prefix = vec![0; n + 1];
|
||||
|
||||
let mut left = 0;
|
||||
for right in 0..n {
|
||||
if s[right] == 0 {
|
||||
window.0 += 1;
|
||||
} else {
|
||||
window.1 += 1;
|
||||
}
|
||||
|
||||
while window.0 > k && window.1 > k {
|
||||
if s[left] == 0 {
|
||||
window.0 -= 1;
|
||||
} else {
|
||||
window.1 -= 1;
|
||||
}
|
||||
right_array[left] = right;
|
||||
left += 1;
|
||||
}
|
||||
|
||||
prefix[right + 1] = prefix[right] + (right - left + 1) as i64;
|
||||
}
|
||||
|
||||
queries
|
||||
.into_iter()
|
||||
.map(|query| {
|
||||
let (l, r) = (query[0] as usize, query[1] as usize);
|
||||
let min_r = right_array[l].min(r + 1) as i64;
|
||||
let l = l as i64;
|
||||
|
||||
(min_r - l + 1) * (min_r - l) / 2 + prefix[r + 1] - prefix[min_r as usize]
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
}
|
||||
|
||||
// submission codes end
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_3261() {
|
||||
assert_eq!(
|
||||
vec![26],
|
||||
Solution::count_k_constraint_substrings("0001111".to_owned(), 2, vec![vec![0, 6]])
|
||||
);
|
||||
assert_eq!(
|
||||
vec![15, 9, 3],
|
||||
Solution::count_k_constraint_substrings(
|
||||
"010101".to_owned(),
|
||||
1,
|
||||
vec![vec![0, 5], vec![1, 4], vec![2, 3]]
|
||||
)
|
||||
);
|
||||
assert_eq!(
|
||||
vec![1, 3, 1],
|
||||
Solution::count_k_constraint_substrings(
|
||||
"00".to_owned(),
|
||||
1,
|
||||
vec![vec![0, 0], vec![0, 1], vec![1, 1]]
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user