diff --git a/src/main.rs b/src/main.rs index 1f467bf..09d9877 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,74 +1,32 @@ -use crate::arr::make_matrix; +use std::collections::HashMap; mod arr; struct Solution {} -const MOD: i64 = 1_000_000_007; - -fn mod_pow(mut a: i64, mut e: i64) -> i64 { - let mut r = 1i64; - a %= MOD; - while e > 0 { - if (e & 1) == 1 { - r = r * a % MOD; - } - a = a * a % MOD; - e >>= 1; - } - r -} - -fn mod_inv(x: i64) -> i64 { - // 仅当 x % MOD != 0 时存在逆元 - mod_pow(x, MOD - 2) -} impl Solution { - pub fn xor_after_queries(nums: Vec, queries: Vec>) -> i32 { - let mut nums = nums.into_iter().map(|x| x as i64).collect::>(); - let pivot = queries.len().isqrt(); - let mut diff = vec![vec![1_i64; nums.len() + pivot]; pivot]; - for q in &queries { - let [l, r, k, v]: [i32; 4] = q.as_slice().try_into().unwrap(); - let k = k as usize; - let l = l as usize; - let r = r as usize; - if k >= pivot { - for i in (l..=r).step_by(k) { - nums[i] = (nums[i] * v as i64) % MOD - } + pub fn minimum_distance(nums: Vec) -> i32 { + let mut mp = HashMap::>::new(); + for i in 0..nums.len() { + if mp.contains_key(&nums[i]) { + mp.get_mut(&nums[i]).unwrap().push(i as i32); } else { - diff[k][l] = (diff[k][l] * v as i64) % MOD; - let r_idx = r - (r - l) % k + k; - diff[k][r_idx] = (diff[k][r_idx] * mod_inv(v as i64)) % MOD; + mp.insert(nums[i], vec![i as i32]); } } - for i in 1..pivot { - for j in 0..i { - for k in (j + i..nums.len() + 1).step_by(i) { - diff[i][k] = (diff[i][k - i] * diff[i][k]) % MOD; - } + let mut ans = 1e9 as i32; + for key in mp.keys() { + let arr = mp.get(key).unwrap(); + if arr.len() < 3 { + continue; + } + for i in 2..arr.len() { + ans = ans.min(arr[i] - arr[i - 2]); } } - for i in 1..pivot { - for j in 0..nums.len() { - nums[j] = (nums[j] * diff[i][j]) % MOD - } - } - for i in 1..nums.len() { - nums[0] ^= nums[i]; - } - nums[0] as i32 + if ans == 1e9 as i32 { -1 } else { ans * 2 } } } fn main() { - println!( - "{:?}", - Solution::xor_after_queries( - vec![562, 62], - make_matrix( - "[[0,1,2,7],[1,1,2,11],[0,1,2,2],[1,1,1,11],[1,1,2,1],[0,0,1,9],[0,1,2,4],[1,1,1,6],[0,0,2,17]]" - ) - ) - ); + println!("{:?}", Solution::minimum_distance(vec![1,1,2,3,2,1,2],)); }