题目链接: Rings
大致题意
给定一个长度为 n n n二进制串, 要求你选择出两个长度大于等于 ⌊ n 2 ⌋ \lfloor \frac n2 \rfloor ⌊2n⌋的, 且不相同区间. 使得这两个区间的二进制子串构成的数字 a , b a, b a,b 满足 a = b ∗ k ( k ≥ 0 ) a = b * k (k \ge 0) a=b∗k(k≥0).
题目要求: 输出任意一组合法区间.
解题思路
思维 (感觉这题的思路有点做构造题的感觉)
首先如果二进制串是全1串, 则我们选取[1, n - 1], [2, n]一定满足题意.
反之, 串中一定存在0. 我们从左向右扫描串, 得到第一个0所在的位置index.
如果此时
i
n
d
e
x
≤
⌊
n
2
⌋
index \le\lfloor \frac n2 \rfloor
index≤⌊2n⌋, 则我们可以选取(011111…, 11111…)这样的序列.
区间为: [index, n], [index + 1, n] 使得
a
=
=
b
a == b
a==b.
反之此时
i
n
d
e
x
>
⌊
n
2
⌋
index > \lfloor \frac n2 \rfloor
index>⌊2n⌋, 则我们可以选取(111…110, 111…11)这样的序列.
区间为: [1, index], [1, index - 1], 使得
a
=
=
2
b
a == 2b
a==2b.
AC代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
int main()
{
int t; cin >> t;
while (t--) {
int n; string s; cin >> n >> s;
int index = 0;
for (int i = 0; i < n; ++i) {
if (s[i] == '0') {
index = i + 1;
break;
}
}
if (index == 0) { //无0
int l1 = 1, r1 = n - 1, l2 = 2, r2 = n;
printf("%d %d %d %d\n", l1, r1, l2, r2);
continue;
}
if (index <= n / 2) { //9 4
int l1 = index, r1 = n, l2 = index + 1, r2 = n;
printf("%d %d %d %d\n", l1, r1, l2, r2);
}
else {
int l1 = 1, r1 = index, l2 = 1, r2 = index - 1;
printf("%d %d %d %d\n", l1, r1, l2, r2);
}
}
return 0;
}