← Home
For problem statement at 0-999/700-799/750-759/754/problemC.txt this is a correct solution, but verifier at 0-999/700-799/750-759/754/verifierC.go ends with case 1 failed: runtime error: exit status 2
Impossible
Impossible
panic: runtime error: index out of range [-1]

goroutine 1 [running]:
main.main()
	/tmp/build-1072925480/solution.go:138 +0x64c

exit status 1 can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"unicode"
)

var reader = bufio.NewReader(os.Stdin)

func nextToken() string {
	var sb strings.Builder
	for {
		r, _, err := reader.ReadRune()
		if err != nil {
			break
		}
		if unicode.IsSpace(r) {
			if sb.Len() > 0 {
				break
			}
		} else {
			sb.WriteRune(r)
		}
	}
	return sb.String()
}

func nextLine() string {
	var sb strings.Builder
	for {
		r, _, err := reader.ReadRune()
		if err != nil {
			return ""
		}
		if !unicode.IsSpace(r) {
			sb.WriteRune(r)
			break
		}
	}
	for {
		r, _, err := reader.ReadRune()
		if err != nil || r == '\n' {
			break
		}
		if r != '\r' {
			sb.WriteRune(r)
		}
	}
	return sb.String()
}

func mentions(text, user string) bool {
	wordStart := -1
	for i := 0; i <= len(text); i++ {
		var isAlnum bool
		if i < len(text) {
			c := text[i]
			isAlnum = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')
		}
		if isAlnum {
			if wordStart == -1 {
				wordStart = i
			}
		} else {
			if wordStart != -1 {
				if text[wordStart:i] == user {
					return true
				}
				wordStart = -1
			}
		}
	}
	return false
}

func main() {
	tStr := nextToken()
	if tStr == "" {
		return
	}
	t, _ := strconv.Atoi(tStr)

	for caseNum := 0; caseNum < t; caseNum++ {
		nStr := nextToken()
		n, _ := strconv.Atoi(nStr)

		users := make([]string, n)
		for i := 0; i < n; i++ {
			users[i] = nextToken()
		}

		mStr := nextToken()
		m, _ := strconv.Atoi(mStr)

		messages := make([]string, m)
		for i := 0; i < m; i++ {
			messages[i] = nextLine()
		}

		dp := make([][]bool, m)
		prev := make([][]int, m)

		for i := 0; i < m; i++ {
			dp[i] = make([]bool, n)
			prev[i] = make([]int, n)

			colon := strings.Index(messages[i], ":")
			sender := messages[i][:colon]
			text := messages[i][colon+1:]

			for j := 0; j < n; j++ {
				if sender != "?" && sender != users[j] {
					continue
				}
				if mentions(text, users[j]) {
					continue
				}
				if i == 0 {
					dp[i][j] = true
				} else {
					for k := 0; k < n; k++ {
						if k != j && dp[i-1][k] {
							dp[i][j] = true
							prev[i][j] = k
							break
						}
					}
				}
			}
		}

		lastUser := -1
		for j := 0; j < n; j++ {
			if dp[m-1][j] {
				lastUser = j
				break
			}
		}

		if lastUser == -1 {
			fmt.Println("Impossible")
		} else {
			ans := make([]int, m)
			curr := lastUser
			for i := m - 1; i >= 0; i-- {
				ans[i] = curr
				curr = prev[i][curr]
			}
			for i := 0; i < m; i++ {
				colon := strings.Index(messages[i], ":")
				text := messages[i][colon+1:]
				fmt.Printf("%s:%s\n", users[ans[i]], text)
			}
		}
	}
}