← Home
For problem statement at 0-999/800-899/890-899/898/problemF.txt this is a correct solution, but verifier at 0-999/800-899/890-899/898/verifierF.go ends with All tests passed can you fix the verifier? package main

import (
	"bytes"
	"fmt"
	"io"
	"os"
)

func main() {
	input, _ := io.ReadAll(os.Stdin)
	var sBuf []byte
	for _, b := range input {
		if b >= '0' && b <= '9' {
			sBuf = append(sBuf, b)
		}
	}
	s := string(sBuf)
	n := len(s)
	if n < 3 {
		return
	}

	M := []int{1000000007, 1000000009}
	pref := make([][]int, 2)
	pow := make([][]int, 2)

	for k := 0; k < 2; k++ {
		pref[k] = make([]int, n+1)
		pow[k] = make([]int, n+1)
		pow[k][0] = 1
		for i := 0; i < n; i++ {
			pow[k][i+1] = (pow[k][i] * 10) % M[k]
			pref[k][i+1] = (pref[k][i]*10 + int(s[i]-'0')) % M[k]
		}
	}

	getHash := func(l, r, idx int) int {
		val := (pref[idx][r] - pref[idx][l]*pow[idx][r-l]) % M[idx]
		if val < 0 {
			val += M[idx]
		}
		return val
	}

	verify := func(i, j int) bool {
		pA, pB, pC := i-1, j-1, n-1
		carry := 0
		for pA >= 0 || pB >= i || carry > 0 {
			sum := carry
			if pA >= 0 {
				sum += int(s[pA] - '0')
				pA--
			}
			if pB >= i {
				sum += int(s[pB] - '0')
				pB--
			}
			if pC < j || int(s[pC]-'0') != sum%10 {
				return false
			}
			carry = sum / 10
			pC--
		}
		return pC == j-1
	}

	for Lc := 1; Lc <= n-2; Lc++ {
		candidates := []int{Lc, Lc - 1, n - 2*Lc, n - 2*Lc + 1}
		for _, La := range candidates {
			if La < 1 {
				continue
			}
			Lb := n - Lc - La
			if Lb < 1 {
				continue
			}

			if La > 1 && s[0] == '0' {
				continue
			}
			if Lb > 1 && s[La] == '0' {
				continue
			}
			if Lc > 1 && s[La+Lb] == '0' {
				continue
			}

			hA1 := getHash(0, La, 0)
			hB1 := getHash(La, La+Lb, 0)
			hC1 := getHash(La+Lb, n, 0)
			if (hA1+hB1)%M[0] != hC1 {
				continue
			}

			hA2 := getHash(0, La, 1)
			hB2 := getHash(La, La+Lb, 1)
			hC2 := getHash(La+Lb, n, 1)
			if (hA2+hB2)%M[1] != hC2 {
				continue
			}

			if verify(La, La+Lb) {
				var out bytes.Buffer
				out.WriteString(s[:La])
				out.WriteByte('+')
				out.WriteString(s[La : La+Lb])
				out.WriteByte('=')
				out.WriteString(s[La+Lb:])
				fmt.Println(out.String())
				return
			}
		}
	}
}