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)
}
}
}
}