← Home
For problem statement at 1000-1999/1800-1899/1840-1849/1849/problemF.txt this is a correct solution, but verifier at 1000-1999/1800-1899/1840-1849/1849/verifierF.go ends with test 5 failed:
expected: 00101
got: 00100
input:
5
243 110 230 745 969
exit status 1 can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
)

type Element struct {
	val int
	id  int
}

var A []Element
var ans []byte

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func max3(a, b, c int) int {
	return max(a, max(b, c))
}

func min4(a, b, c, d int) int {
	return min(min(a, b), min(c, d))
}

func maxK(S []Element) int {
	if len(S) == 3 {
		a, b, c := S[0].val, S[1].val, S[2].val
		return max3(a^b, b^c, c^a)
	}
	if len(S) == 4 {
		a, b, c, d := S[0].val, S[1].val, S[2].val, S[3].val
		t1 := max3(a^b, b^c, c^a)
		t2 := max3(a^b, b^d, d^a)
		t3 := max3(a^c, c^d, d^a)
		t4 := max3(b^c, c^d, d^b)
		return min4(t1, t2, t3, t4)
	}
	return 1 << 30
}

func findSplit(l, r, d int) int {
	low, high := l, r
	for low < high {
		mid := int(uint(low+high) >> 1)
		if (A[mid].val & (1 << d)) == 0 {
			low = mid + 1
		} else {
			high = mid
		}
	}
	return low
}

func solve(l, r, d int) int {
	if r-l <= 2 {
		return 1 << 30
	}
	if d < 0 {
		return 0
	}
	m := findSplit(l, r, d)
	if m == l || m == r {
		return solve(l, r, d-1)
	}
	if m-l <= 2 && r-m <= 2 {
		return maxK(A[l:r])
	}
	return min(solve(l, m, d-1), solve(m, r, d-1))
}

func colorSmallGraph(l, r, K int) {
	S := r - l
	adj := make([][]int, S)
	for i := 0; i < S; i++ {
		for j := i + 1; j < S; j++ {
			if (A[l+i].val^A[l+j].val) < K {
				adj[i] = append(adj[i], j)
				adj[j] = append(adj[j], i)
			}
		}
	}

	color := make([]int, S)
	for i := 0; i < S; i++ {
		color[i] = -1
	}

	for i := 0; i < S; i++ {
		if color[i] == -1 {
			color[i] = 0
			q := []int{i}
			for len(q) > 0 {
				u := q[0]
				q = q[1:]
				for _, v := range adj[u] {
					if color[v] == -1 {
						color[v] = 1 - color[u]
						q = append(q, v)
					}
				}
			}
		}
	}

	for i := 0; i < S; i++ {
		ans[A[l+i].id] = byte(color[i] + '0')
	}
}

func colorAll(l, r, d, K int) {
	if r-l <= 4 {
		colorSmallGraph(l, r, K)
		return
	}
	m := findSplit(l, r, d)
	if m == l || m == r {
		colorAll(l, r, d-1, K)
	} else {
		colorAll(l, m, d-1, K)
		colorAll(m, r, d-1, K)
	}
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())
	A = make([]Element, n)
	for i := 0; i < n; i++ {
		scanner.Scan()
		val, _ := strconv.Atoi(scanner.Text())
		A[i] = Element{val, i}
	}

	sort.Slice(A, func(i, j int) bool {
		return A[i].val < A[j].val
	})

	ans = make([]byte, n)
	K_opt := solve(0, n, 29)
	colorAll(0, n, 29, K_opt)

	fmt.Println(string(ans))
}