For problem statement at 1000-1999/1700-1799/1770-1779/1773/problemA.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1770-1779/1773/verifierA.go ends with test 1 case 4: candidate claims Possible but reference Impossible
input case:
n = 5
a = 5 1 4 2 3
exit status 1 can you fix the verifier? ```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var t int
fmt.Fscan(in, &t)
for test := 0; test < t; test++ {
var n int
fmt.Fscan(in, &n)
a := make([]int, n+1)
for i := 1; i <= n; i++ {
fmt.Fscan(in, &a[i])
}
b := make([]int, n+1)
for i := 1; i <= n; i++ {
b[a[i]] = i
}
// Count number of 2-cycles
var k int
visited := make([]bool, n+1)
for i := 1; i <= n; i++ {
if !visited[i] {
length := 0
curr := i
for !visited[curr] {
visited[curr] = true
curr = b[curr]
length++
}
if length == 2 {
k++
}
}
}
if n == 1 || (n <= 3 && k == 1) {
fmt.Fprintln(out, "Impossible")
continue
}
// Now construct
visited2 := make([]bool, n+1)
q := make([]int, n+1)
for i := 1; i <= n; i++ {
if !visited2[i] {
var cycle []int
curr := i
for !visited2[curr] {
visited2[curr] = true
cycle = append(cycle, curr)
curr = b[curr]
}
l := len(cycle)
if l >= 3 {
for j := 0; j < l; j++ {
q[cycle[j]] = cycle[(j-1+l)%l]
}
}
}
}
// Collect remaining
var rem []int
for i := 1; i <= n; i++ {
if q[i] == 0 {
rem = append(rem, i)
}
}
s := len(rem)
if s > 0 {
sort.Ints(rem)
idx := make(map[int]int)
for ii := 0; ii < s; ii++ {
idx[rem[ii]] = ii
}
badarr := make([]bool, s)
for ii := 0; ii < s; ii++ {
p := rem[ii]
if b[p] != p {
badd := (idx[b[p]] - ii + s) % s
badarr[badd] = true
}
}
var chosend int
for d := 1; d < s; d++ {
if !badarr[d] {
chosend = d
break
}
}
// Set q
for ii := 0; ii < s; ii++ {
targetidx := (ii + chosend) % s
q[rem[ii]] = rem[targetidx]
}
}
// Compute q_inv
qinv := make([]int, n+1)
for i := 1; i <= n; i++ {
qinv[q[i]] = i
}
// Compute p
p := make([]int, n+1)
for i := 1; i <= n; i++ {
p[i] = b[qinv[i]]
}
// Output
fmt.Fprintln(out, "Possible")
for i := 1; i <= n; i++ {
fmt.Fprintf(out, "%d ", p[i])
}
fmt.Fprintln(out)
for i := 1; i <= n; i++ {
fmt.Fprintf(out, "%d ", q[i])
}
fmt.Fprintln(out)
}
}
```