Skip to content

Commit c8f3abd

Browse files
committed
test passed: find_mid
1 parent 4683f57 commit c8f3abd

File tree

1 file changed

+68
-43
lines changed

1 file changed

+68
-43
lines changed

src/lib.rs

Lines changed: 68 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,17 @@ extern crate quickcheck;
99
#[cfg(test)]
1010
#[macro_use(quickcheck)]
1111
extern crate quickcheck_macros;
12+
use std::isize::{MAX, MIN};
1213

1314
struct Difference<'a, X, Y> {
1415
xv: &'a [X],
1516
yv: &'a [Y],
1617

1718
// working memory for forward path
18-
vf: Vec<usize>,
19+
vf: Vec<isize>,
1920
// working memory for backward path
20-
vb: Vec<usize>,
21-
offset_d: i64,
21+
vb: Vec<isize>,
22+
offset_d: isize,
2223
}
2324

2425
impl<'a, X, Y> Difference<'a, X, Y>
@@ -27,9 +28,9 @@ where
2728
{
2829
fn new(xv: &'a [X], yv: &'a [Y]) -> Self {
2930
let dmax = xv.len() + yv.len() + 1;
30-
let offset_d = yv.len() as i64;
31-
let vf = vec![0usize; dmax];
32-
let vb = vec![!0usize; dmax];
31+
let offset_d = yv.len() as isize;
32+
let vf = vec![MIN; dmax];
33+
let vb = vec![MAX; dmax];
3334
Self {
3435
xv,
3536
yv,
@@ -45,15 +46,22 @@ where
4546
(xl, xr): (usize, usize),
4647
(yl, yr): (usize, usize),
4748
) -> (usize, (usize, usize), (usize, usize)) {
48-
let kmin = xl as i64 - yr as i64;
49-
let kmax = xr as i64 - yl as i64;
50-
let kmidf = xl as i64 - yl as i64; // center diag in this fragment for forwad snake
51-
let kmidb = xr as i64 - yr as i64;
52-
let delta = ((xr - xl) as i64) - ((yr - yl) as i64);
49+
let xl = xl as isize;
50+
let xr = xr as isize;
51+
let yl = yl as isize;
52+
let yr = yr as isize;
53+
54+
let kmin = xl - yr;
55+
let kmax = xr - yl;
56+
let kmidf = xl - yl; // center diag in this fragment for forwad snake
57+
let kmidb = xr - yr;
58+
let delta = (xr - xl) - (yr - yl);
5359
let is_odd = (delta & 1) == 1;
60+
61+
// convert k to index of working memory (vf, vb)
5462
let ktoi = {
5563
let offset = self.offset_d;
56-
move |k: i64| -> usize { (k + offset) as usize }
64+
move |k: isize| -> usize { (k + offset) as usize }
5765
};
5866

5967
self.vf[ktoi(kmidf)] = xl;
@@ -64,25 +72,22 @@ where
6472
let mut kminb = kmidb;
6573
let mut kmaxb = kmidb;
6674

67-
let gety = |x: usize, k: i64| (x as i64 - k) as usize;
75+
let gety = |x: isize, k: isize| x - k;
76+
6877
for d in 0i64.. {
6978
// forward
7079
{
7180
// update range
7281
if d > 0 {
7382
if kminf > kmin {
7483
kminf -= 1;
75-
if let Some(x) = self.vf.get_mut(ktoi(kminf - 1)) {
76-
*x = 0
77-
}
84+
self.vf.get_mut(ktoi(kminf - 1)).map(|x| *x = MIN);
7885
} else {
7986
kminf += 1;
8087
}
8188
if kmaxf < kmax {
8289
kmaxf += 1;
83-
if let Some(x) = self.vf.get_mut(ktoi(kmaxf + 1)) {
84-
*x = 0;
85-
}
90+
self.vf.get_mut(ktoi(kmaxf + 1)).map(|x| *x = MIN);
8691
} else {
8792
kmaxf -= 1
8893
}
@@ -98,37 +103,45 @@ where
98103
max(lo.map(|x| x + 1), hi).unwrap()
99104
};
100105
let y = gety(x, k);
106+
if !(xl <= x && x <= xr && yl <= y && y <= yr) {
107+
continue;
108+
}
109+
101110
let mut u = x;
102111
let mut v = y;
103-
while u < xr && v < yr && self.xv[u] == self.yv[v] {
112+
113+
while u < xr && v < yr && self.xv[u as usize] == self.yv[v as usize] {
104114
u += 1;
105115
v += 1;
106116
}
117+
118+
debug_assert!(xl <= u && u <= xr);
119+
debug_assert!(yl <= v && v <= yr);
120+
107121
self.vf[ik] = u;
108122
if is_odd && kminb <= k && k <= kmaxb && self.vb[ik] <= u {
109-
return (2 * d as usize - 1, (x, y), (u, v));
123+
return (
124+
2 * d as usize - 1,
125+
(x as usize, y as usize),
126+
(u as usize, v as usize),
127+
);
110128
}
111129
}
112130
}
113-
println!("vf {:?}", self.vf);
114131

115132
// backward
116133
{
117134
if d > 0 {
118135
// update range
119136
if kminb > kmin {
120137
kminb -= 1;
121-
if let Some(x) = self.vb.get_mut(ktoi(kminb - 1)) {
122-
*x = !0usize;
123-
}
138+
self.vb.get_mut(ktoi(kminb - 1)).map(|x| *x = MAX);
124139
} else {
125140
kminb += 1;
126141
}
127142
if kmaxb < kmax {
128143
kmaxb += 1;
129-
if let Some(x) = self.vb.get_mut(ktoi(kmaxb + 1)) {
130-
*x = !0usize;
131-
}
144+
self.vb.get_mut(ktoi(kmaxb + 1)).map(|x| *x = MAX);
132145
} else {
133146
kmaxb -= 1
134147
}
@@ -147,20 +160,32 @@ where
147160
}
148161
};
149162
let y = gety(x, k);
163+
if !(xl <= x && x <= xr && yl <= y && y <= yr) {
164+
continue;
165+
}
166+
150167
let mut u = x;
151168
let mut v = y;
152-
while xl < u && yl < v && self.xv[u - 1] == self.yv[v - 1] {
169+
while xl < u && yl < v && self.xv[(u - 1) as usize] == self.yv[(v - 1) as usize]
170+
{
153171
u -= 1;
154172
v -= 1;
155173
}
174+
175+
debug_assert!(xl <= u && u <= xr);
176+
debug_assert!(yl <= v && v <= yr);
177+
156178
let ik = ktoi(k);
157179
self.vb[ik] = u;
158180
if !is_odd && kminf <= k && k <= kmaxf && self.vf[ik] >= u {
159-
return (2 * d as usize, (u, v), (x, y));
181+
return (
182+
2 * d as usize,
183+
(u as usize, v as usize),
184+
(x as usize, y as usize),
185+
);
160186
}
161187
}
162188
}
163-
println!("vb {:?}", self.vb);
164189
}
165190

166191
unreachable!();
@@ -172,18 +197,18 @@ fn find_mid() {
172197
use std::array::IntoIter;
173198
let testcases = IntoIter::new([
174199
(vec![0], vec![1, 1, 1], (4, (0, 2), (0, 2))),
175-
// (vec![0], vec![1, 1], (3, (0, 2), (0, 2))),
176-
// (vec![0], vec![0, 1, 0], (2, (1, 2), (1, 2))),
177-
// (vec![0], vec![0, 0, 0], (2, (0, 1), (1, 2))),
178-
// (vec![0], vec![], (1, (1, 0), (1, 0))),
179-
// (vec![], vec![0], (1, (0, 1), (0, 1))),
180-
// (vec![], vec![], (0, (0, 0), (0, 0))),
181-
// (vec![0, 1, 2], vec![0, 1, 1, 2], (1, (2, 3), (3, 4))),
182-
// (vec![0, 1, 1, 2], vec![0, 1, 2], (1, (3, 2), (4, 3))),
183-
// (vec![0, 1, 2, 3], vec![0, 1, 2], (1, (4, 3), (4, 3))),
184-
// (vec![0, 1, 2], vec![0, 2, 2], (2, (1, 2), (1, 2))),
185-
// (vec![0, 2, 2], vec![0, 1, 2], (2, (1, 2), (1, 2))),
186-
// (vec![0, 1, 2], vec![0, 1, 2], (0, (0, 0), (3, 3))),
200+
(vec![0], vec![1, 1], (3, (0, 2), (0, 2))),
201+
(vec![0], vec![0, 1, 0], (2, (0, 1), (0, 1))),
202+
(vec![0], vec![0, 0, 0], (2, (0, 1), (0, 1))),
203+
(vec![0], vec![], (1, (1, 0), (1, 0))),
204+
(vec![], vec![0], (1, (0, 1), (0, 1))),
205+
(vec![], vec![], (0, (0, 0), (0, 0))),
206+
(vec![0, 1, 2], vec![0, 1, 1, 2], (1, (2, 3), (3, 4))),
207+
(vec![0, 1, 1, 2], vec![0, 1, 2], (1, (3, 2), (4, 3))),
208+
(vec![0, 1, 2, 3], vec![0, 1, 2], (1, (4, 3), (4, 3))),
209+
(vec![0, 1, 2], vec![0, 2, 2], (2, (1, 2), (1, 2))),
210+
(vec![0, 2, 2], vec![0, 1, 2], (2, (1, 2), (1, 2))),
211+
(vec![0, 1, 2], vec![0, 1, 2], (0, (0, 0), (3, 3))),
187212
]);
188213
for (xv, yv, expected) in testcases {
189214
let n = xv.len();

0 commit comments

Comments
 (0)