// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package lcs import ( "fmt" ) // For each D, vec[D] has length D+1, // and the label for (D, k) is stored in vec[D][(D+k)/2]. type label struct { vec [][]int } // Temporary checking DO NOT COMMIT true TO PRODUCTION CODE const debug = false // debugging. check that the (d,k) pair is valid // (that is, -d<=k<=d and d+k even) func checkDK(D, k int) { if k >= -D && k <= D && (D+k)%2 == 0 { return } panic(fmt.Sprintf("out of range, d=%d,k=%d", D, k)) } func (t *label) set(D, k, x int) { if debug { checkDK(D, k) } for len(t.vec) <= D { t.vec = append(t.vec, nil) } if t.vec[D] == nil { t.vec[D] = make([]int, D+1) } t.vec[D][(D+k)/2] = x // known that D+k is even } func (t *label) get(d, k int) int { if debug { checkDK(d, k) } return int(t.vec[d][(d+k)/2]) } func newtriang(limit int) label { if limit < 100 { // Preallocate if limit is not large. return label{vec: make([][]int, limit)} } return label{} }