From 78f001bc32833311dd57b7a6752e57e137276498 Mon Sep 17 00:00:00 2001 From: li-chx Date: Wed, 30 Jul 2025 10:59:42 +0800 Subject: [PATCH] =?UTF-8?q?2419.=20=E6=8C=89=E4=BD=8D=E4=B8=8E=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E7=9A=84=E6=9C=80=E9=95=BF=E5=AD=90=E6=95=B0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 89 ++++++++++++++--------------------------------------- 1 file changed, 23 insertions(+), 66 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7f17257..efcba29 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,79 +1,36 @@ -use std::ops::{AddAssign, SubAssign}; +use std::cmp::max; -struct XorVal { - data: Vec, - count: usize, -} -impl XorVal { - pub fn new() -> Self { - XorVal { data: vec!(0; 32), count: 0 } - } - pub fn get_val(&self) -> i32 { - if self.count == 0 { - return -1; - } - let mut ans = 0; - for i in 0..32 { - if self.data[i] > 0 { - ans |= 1 << i; - } - } - ans - } -} -impl AddAssign for XorVal { - fn add_assign(&mut self, mut x: i32) { - self.count += 1; - let mut i = 0; - while x > 0 { - if x & 1 == 1 { - self.data[i] += 1; - } - x >>= 1; - i += 1; - } - } -} -impl SubAssign for XorVal { - fn sub_assign(&mut self, mut x: i32) { - self.count -= 1; - let mut i = 0; - while x > 0 { - if x & 1 == 1 { - self.data[i] -= 1; - } - x >>= 1; - i += 1; - } - } -} struct Solution; impl Solution { - pub fn smallest_subarrays(nums: Vec) -> Vec { - let mut ans = vec![0; nums.len()]; - let mut xor = vec![0; nums.len()]; - xor[nums.len() - 1] = nums[nums.len() - 1]; - for i in (0..nums.len() - 1).rev() { - xor[i] = xor[i + 1] | nums[i]; - } - let mut xor_val = XorVal::new(); - let (mut l, mut r) = (0, 0); + pub fn longest_subarray(nums: Vec) -> i32 { + let mut ans = 0; + let mut ans_val = 0; + let mut last = 0; + let mut count = 0; for i in 0..nums.len() { - while l < i && l <= r { - xor_val -= nums[l]; - l += 1; + if nums[i] != last { + if ans_val < last { + ans_val = last; + ans = count; + }else if ans_val == last { + ans = max(count,ans); + } + last = nums[i]; + count = 1; + } else { + count += 1; } - while xor_val.get_val() < xor[i] { - xor_val += nums[r]; - r += 1; - } - ans[i] = (r - l) as i32; + } + if ans_val < last { + ans = count; + }else if ans_val == last { + ans = max(count,ans); } ans } } fn main() { - let sl = Solution::smallest_subarrays(vec![0]); + let sl = Solution::longest_subarray(vec![96317,96317,96317,96317,96317,96317,96317,96317,96317,279979]); println!("{:?}", sl); }