For each string s consisting of characters '0' and '1' one can define four integers a00, a01, a10 and a11, where axy is the number ofsubsequences of length 2 of the string s equal to the sequence {x, y}.
In these problem you are given four integers a00, a01, a10, a11 and have to find any non-empty string s that matches them, or determine that there is no such string. One can prove that if at least one answer exists, there exists an answer of length no more than 1 000 000.
The only line of the input contains four non-negative integers a00, a01, a10 and a11. Each of them doesn't exceed 109.
If there exists a non-empty string that matches four integers from the input, print it in the only line of the output. Otherwise, print "Impossible". The length of your answer must not exceed 1 000 000.
1 2 3 4
Impossible
1 2 2 1
0110
题意:
一个字符串只能有0和1,现在告诉你字符串里00,01,10,11(可以不是连续)的个数,问你能不能找到这样一个字符串,可以的话输出。
思路:
首先我们可以从00和11的对数找到0和1的个数,这里要小心如果是0的话可以是0个或1个。然后对于1个字符串,0要么在1前面要么在1后面,所以01和10的个数加起来应该是cnt0*cnt1,好现在开始构造,假如我们第一个输出0,那么这个问题就变成了cnt0-1个9,cnt1个1,cnt01-cnt1个01,cnt10个10能否构成一个串,不行的话就输出1,所以我们只要循环判断就行了。
代码:
#include <bits/stdc++.h>
using namespace std;
int _00,_01,_10,_11;
vector<int>po0,po1;
void get(int v, vector<int>&p){
if(v == 0) p.push_back(0);
for(int i = 1; i < 1e5; ++i)
if((i-1)*i/2 == v){
p.push_back(i);
break;
}
}
inline bool check(int cnt0, int a01, int a10, int cnt1){
if(cnt0<0 ||cnt1<0||a01<0||a10<0) return false;
return cnt0*cnt1 == a01 + a10;
}
int main(){
bool ok = false;
int n0 = -1,n1 = -1;
cin>>_00>>_01>>_10>>_11;
get(_00,po0);get(_11,po1);
for(auto i:po0)
for(auto j:po1)
if(check(i,_01,_10,j)){
ok = true; n0 = i; n1 = j; break;
}
if(!ok ) return puts("Impossible"),0;
while(n0>0||n1>0){
if(check(n0-1,_01-n1,_10,n1)){
putchar('0');
n0--;
_01-=n1;
}else{
putchar('1');
n1--;
_10-=n0;
}
}
puts("");
return 0;
}