/*
二分搜索出一个01段或10即可
先用n个0确定1的个数num
然后测试区间[l,mid]是否全是0或全是1
如果是,则l=mid,否则r=mid,直到l+1==r
然后再测试l是1还是r是1
如何判定[l,mid]是否全是0或1,将这一段变成1进行询问,如果结果=num+len或者结果=num-len,那么就是全0|1
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 1050
char s[maxn];
int n,num;
int query(
char *
str){
int res;
cout<<
"? "<<str<<
endl;
cin>>
res;
return res;
}
int judge(
int l,
int mid){
for(
int i=
1;i<=n;i++)s[i]=
'0';
for(
int i=l;i<=mid;i++)s[i]=
'1';
int res=query(s+
1),len=mid-l+
1;
if(res==num+len||res==num-len)
return 0;
return 1;
}
int main(){
cin>>
n;
for(
int i=
1;i<=n;i++)s[i]=
'0';
num=query(s+
1);
int l=
1,r=
n,mid;
while(l+
1<
r){
int mid=l+r>>
1;
if(judge(l,mid))
//如果[l,mid]区间有0|1
r=
mid;
else l=
mid;
}
for(
int i=
1;i<=n;i++
)
s[i]=
'0';s[l]=
'1';
int tmp=query(s+
1);
if(tmp>num)
//l位置是0
cout<<
"! "<<l<<
" "<<r<<
endl;
else cout<<
"! "<<r<<
" "<<l<<
endl;
}
转载于:https://www.cnblogs.com/zsben991126/p/10343140.html