```go
package main
import (
"fmt"
"os"
"strings"
)
var n int
var d0 int
func main() {
fmt.Scan(&n)
// Query all zeros
allZero := strings.Repeat("0", n)
fmt.Println(allZero)
os.Stdout.Sync()
fmt.Scan(&d0)
// Query flip position 1
query := []byte(strings.Repeat("0", n))
query[0] = '1'
fmt.Println(string(query))
os.Stdout.Sync()
var d int
fmt.Scan(&d)
delta := d - d0
var s1 byte
if delta == 1 {
s1 = '0'
} else if delta == -1 {
s1 = '1'
} else {
// Invalid, but should not happen
os.Exit(1)
}
var pos0, pos1 int
if s1 == '0' {
pos0 = 1
pos1 = findPosition(2, n, true)
} else {
pos1 = 1
pos0 = findPosition(2, n, false)
}
fmt.Printf("! %d %d\n", pos0, pos1)
os.Stdout.Sync()
}
func findPosition(l, h int, findOne bool) int {
if l == h {
return l
}
low := l
high := h
for low < high {
mid := (low + high) / 2
fSize := mid - low + 1
query := []byte(strings.Repeat("0", n))
for i := low; i <= mid; i++ {
query[i-1] = '1'
}
fmt.Println(string(query))
os.Stdout.Sync()
var dd int
fmt.Scan(&dd)
k := (d0 + fSize - dd) / 2
var goLeft bool
if findOne {
goLeft = (k >= 1)
} else {
goLeft = (k < fSize)
}
if goLeft {
high = mid
} else {
low = mid + 1
}
}
return low
}
```