← Home
```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
}
```