| 328 | } |
| 329 | |
| 330 | function myersX(longer: string, shorter: string, peq: Uint32Array): number { |
| 331 | const n = shorter.length; |
| 332 | const m = longer.length; |
| 333 | const mhc: number[] = []; |
| 334 | const phc: number[] = []; |
| 335 | const horizontalSize = Math.ceil(n / 32); |
| 336 | const verticalSize = Math.ceil(m / 32); |
| 337 | |
| 338 | for (let i = 0; i < horizontalSize; i++) { |
| 339 | phc[i] = -1; |
| 340 | mhc[i] = 0; |
| 341 | } |
| 342 | |
| 343 | let j = 0; |
| 344 | |
| 345 | for (; j < verticalSize - 1; j++) { |
| 346 | let mv = 0; |
| 347 | let pv = -1; |
| 348 | const start = j * 32; |
| 349 | const verticalLen = Math.min(32, m) + start; |
| 350 | |
| 351 | for (let k = start; k < verticalLen; k++) { |
| 352 | peq[longer.charCodeAt(k)] |= 1 << k; |
| 353 | } |
| 354 | |
| 355 | for (let i = 0; i < n; i++) { |
| 356 | const eq = peq[shorter.charCodeAt(i)]; |
| 357 | const pb = (phc[(i / 32) | 0] >>> i) & 1; |
| 358 | const mb = (mhc[(i / 32) | 0] >>> i) & 1; |
| 359 | const xv = eq | mv; |
| 360 | const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb; |
| 361 | let ph = mv | ~(xh | pv); |
| 362 | let mh = pv & xh; |
| 363 | |
| 364 | if ((ph >>> 31) ^ pb) { |
| 365 | phc[(i / 32) | 0] ^= 1 << i; |
| 366 | } |
| 367 | |
| 368 | if ((mh >>> 31) ^ mb) { |
| 369 | mhc[(i / 32) | 0] ^= 1 << i; |
| 370 | } |
| 371 | |
| 372 | ph = (ph << 1) | pb; |
| 373 | mh = (mh << 1) | mb; |
| 374 | pv = mh | ~(xv | ph); |
| 375 | mv = ph & xv; |
| 376 | } |
| 377 | |
| 378 | for (let k = start; k < verticalLen; k++) { |
| 379 | peq[longer.charCodeAt(k)] = 0; |
| 380 | } |
| 381 | } |
| 382 | |
| 383 | let mv = 0; |
| 384 | let pv = -1; |
| 385 | const start = j * 32; |
| 386 | const verticalLen = Math.min(32, m - start) + start; |
| 387 | |