← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

func evalNoBracket(nums []uint64, ops []byte) uint64 {
	if len(nums) == 0 {
		return 0
	}
	var sum uint64 = 0
	var currentProd uint64 = nums[0]
	for i := 0; i < len(ops); i++ {
		if ops[i] == '*' {
			currentProd *= nums[i+1]
		} else {
			sum += currentProd
			currentProd = nums[i+1]
		}
	}
	sum += currentProd
	return sum
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	if !scanner.Scan() {
		return
	}
	s := scanner.Text()

	if len(s) == 0 {
		return
	}

	var nums []uint64
	var ops []byte

	for i := 0; i < len(s); i++ {
		if i%2 == 0 {
			nums = append(nums, uint64(s[i]-'0'))
		} else {
			ops = append(ops, s[i])
		}
	}

	var LCandidates []int
	var RCandidates []int

	LCandidates = append(LCandidates, 0)
	for i := 0; i < len(ops); i++ {
		if ops[i] == '*' {
			LCandidates = append(LCandidates, i+1)
			RCandidates = append(RCandidates, i)
		}
	}
	RCandidates = append(RCandidates, len(nums)-1)

	var maxVal uint64 = 0

	for _, L := range LCandidates {
		for _, R := range RCandidates {
			if L <= R {
				bracketNums := nums[L : R+1]
				var bracketOps []byte
				if L < R {
					bracketOps = ops[L:R]
				}
				val := evalNoBracket(bracketNums, bracketOps)

				newNums := make([]uint64, 0, len(nums)-(R-L))
				newNums = append(newNums, nums[:L]...)
				newNums = append(newNums, val)
				newNums = append(newNums, nums[R+1:]...)

				newOps := make([]byte, 0, len(ops)-(R-L))
				newOps = append(newOps, ops[:L]...)
				newOps = append(newOps, ops[R:]...)

				res := evalNoBracket(newNums, newOps)
				if res > maxVal {
					maxVal = res
				}
			}
		}
	}

	fmt.Println(maxVal)
}