#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define dbg(...) 47
#endif
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
#ifdef LOCAL
vector<int> p(n);
for (int i = 0; i < n; i++) {
cin >> p[i];
p[i] = i;
}
swap(p[0], p[8191]);
#endif
int cnt = 0;
auto ask = [&](vector<int> pos) {
cnt++;
string s(n, '0');
for (auto i : pos) {
s[i] = '1';
}
#ifdef LOCAL
string t(n, ' ');
for (int i = 0; i < n; i++) {
t[p[i]] = s[i];
}
int c = 0;
for (int i = 1; i < n; i++) {
c += t[i] != t[i - 1];
}
return c;
#endif
cout << "? " << s << endl;
int ret;
cin >> ret;
return ret;
};
vector<vector<int>> s1(20, vector<int>(n));
vector<vector<int>> s2(20, vector<int>(n));
for (int i = 0; (1 << i) < n; i++) {
int x = (1 << i);
vector<int> pos;
for (int j = 0; j < n; j += 2 * x) {
for (int k = j; k < min(j + x, n); k++) {
pos.push_back(k);
}
}
vector<bool> vis(n);
for (auto j : pos) {
vis[j] = true;
}
vector<int> s;
for (int j = 0; j < n; j++) {
if (!vis[j]) {
s.push_back(j);
}
}
int l = -1, r = pos.size() - 1;
if (ask(pos) % 2 == 1) {
vector<int> ans;
while (l + 1 < r) {
int m = (l + r) / 2;
vector<int> t = s;
for (int j = 0; j <= m; j++) {
t.push_back(pos[j]);
}
if (ask(t) % 2 == 0) {
r = m;
} else {
l = m;
}
}
ans.push_back(pos[r]);
set<int> rem;
for (int j = 0; j < i; j++) {
for (int k = 0; k < n; k++) {
if (s2[j][k] && s1[j][ans[0]]) {
rem.insert(k);
}
if (s1[j][k] && s2[j][ans[0]]) {
rem.insert(k);
}
}
}
vector<int> s_nw;
for (auto k : s) {
if (!rem.count(k)) {
s_nw.push_back(k);
}
}
dbg(cnt);
swap(s, s_nw);
dbg(s.size());
l = -1, r = s.size() - 1;
while (l + 1 < r) {
int m = (l + r) / 2;
vector<int> t = pos;
for (int j = 0; j <= m; j++) {
t.push_back(s[j]);
}
if (ask(t) % 2 == 0) {
r = m;
} else {
l = m;
}
}
dbg(cnt);
ans.push_back(s[r]);
cout << "! " << ans[0] << ' ' << ans[1] << '\n';
return 0;
}
for (auto j : pos) s1[i][j] = true;
for (auto j : s) s2[i][j] = true;
}
return 0;
}