题目大意:
给你t组数据
每组数据给你一个n代表字符串长度
然后给你一个01字符串
让你取这个字符串中两个区间并且二进制转化成10进制之后是倍数关系(并且第一个区间要比第二个区间的数大)(并且区间长度>=n/2)
思路:
因为0如果放一个二进制数前面其实无关紧要
而放后面就相当于乘2的关系
那直接找到0的位置
然后找一个区间包括这个0,一个区间不包括这个0,并且这两个区间取同一个方向
设0的位置为i
要不就是[1,i],[1,i-1]
要不就是[i,n],[i+1,n]
就除了0以外其他数都相同
而如果全是1的情况
那随便取两个区间大于等于n/2长度的就好了
AC代码:
#include <bits/stdc++.h>
using namespace std;
string s;
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n>>s;
int ok=1;
for(int i=0;i<n;i++){
if(s[i]=='0'){
if(i>=n/2)cout<<1<<' '<<i+1<<' '<<1<<' '<<i;
else cout<<i+1<<' '<<n<<' '<<i+2<<' '<<n;
ok=0;
break;
}
}
if(ok)cout<<1<<' '<<n-1<<' '<<2<<' '<<n;
cout<<endl;
}
return 0;
}