F. Binary String Reconstruction
题目大意:
告诉n0,n1,n2,让你给出符合情况的子序列。
分别代表如下:
取两个连续子序列
如果是11,那么n2++;
如果是01/10,那么n1++;
如果是00,那么n0++。
思路:
0000…101010111111
先放n0+1个0,再放满足n1的10,再放符合条件的1。
但是此时10串一定是奇数个,如要偶数n1,最后111…后面加上0。
一、n0&&n2
按照上述说法写。
二、n0&&!n2
00001010101010…
先放n0+1个0,再放满足n1的10。因为后面没有111…串,所以奇偶性都能满足。
三、!n0&&n2
0101010101111111…
奇数n1就这样,偶数n1尾巴+0。
四、!n0&&!n2
就输出01串。
代码:
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
typedef long long ll;
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t;
int n0, n1, n2;
cin >> t;
while (t--) {
cin >> n0 >> n1 >> n2;
string s0 = "", s1 = "", s2 = "";
// string s0,s1,s2;
if (n0) s0 += '0';
if (n2) s2 += '1';
while (n0 > 0) s0 += '0', n0--;
while (n2 > 0) s2 += '1', n2--;
//先把连续0与1字串搞定。
if (s2.size()&&s0.size()) {
if (n1 & 1) for (int i = 1; i <= n1 / 2; i++) s1 += "10";
else {
if (n1) {
for (int i = 1; i < n1 / 2; i++) s1 += "10";
s2 += '0';
//通过向1111...后面加一个0实现奇数转化。非常方便。
}
}
} else if (s0.size()) {
for (int i = 1; i <= n1 / 2; i++)
s1 += "10";
if (n1 & 1) s0 = '1' + s0;
}
else if(s2.size())
{
for(int i=1;i<=n1/2;i++) s1+="10";
if(n1&1) s2=s2+'0';
}
else {
for (int i = 1; i <= (n1 + 1) / 2; i++) s1 += "10";
if (n1 % 2 == 0) s1 += '1';
}
cout << s0 << s1 << s2 << endl;
}
return 0;
}