← Home
For problem statement at 1000-1999/1300-1399/1380-1389/1383/problemE.txt this is a correct solution, but verifier at 1000-1999/1300-1399/1380-1389/1383/verifierE.go ends with wrong answer on test 1
input:
wxlkyjq
expected:30
got:7
exit status 1 can you fix the verifier? ```go
package main

import (
	"fmt"
	"io"
	"os"
	"strings"
)

const MOD int64 = 1000000007

func add(a, b int64) int64 {
	return (a + b) % MOD
}

func sub(a, b int64) int64 {
	return ((a - b) % MOD + MOD) % MOD
}

func mul(a, b int64) int64 {
	return (a * b) % MOD
}

type Block struct {
	val  int
	sDp  int64
	sVdp int64
}

func main() {
	bytes, err := io.ReadAll(os.Stdin)
	if err != nil {
		return
	}
	s := strings.TrimSpace(string(bytes))
	if len(s) == 0 {
		return
	}

	c := make([]int, 0)
	cz := 0
	for i := 0; i < len(s); i++ {
		if s[i] == '0' {
			cz++
		} else {
			c = append(c, cz)
			cz = 0
		}
	}
	c = append(c, cz)

	m := len(c) - 1
	if m == 0 {
		fmt.Println(c[0] % int(MOD))
		return
	}

	dp := make([]int64, m)
	dp[0] = int64(c[0]+1) % MOD

	stack := make([]Block, 0)

	push := func(val int, sDp int64) {
		valMod := (int64(val)%MOD + MOD) % MOD
		sVdp := mul(valMod, sDp)
		stack = append(stack, Block{val: val, sDp: sDp, sVdp: sVdp})
	}

	push(-1, dp[0])

	for i := 1; i < m; i++ {
		curr := c[i]
		var SDp int64 = 0
		var SVdp int64 = 0

		for len(stack) > 0 && stack[len(stack)-1].val <= curr {
			top := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			SDp = add(SDp, top.sDp)
			SVdp = add(SVdp, top.sVdp)
		}

		term1 := mul(int64(curr), SDp)
		dpi := sub(term1, SVdp)

		push(curr, SDp)
		push(-1, dpi)

		dp[i] = dpi
	}

	var sumDp int64 = 0
	for i := 0; i < m; i++ {
		sumDp = add(sumDp, dp[i])
	}

	ans := mul(sumDp, int64(c[m]+1))
	fmt.Println(ans)
}
```