fork download
  1. #include <iostream>
  2. #include<bits/stdc++.h>
  3. #define all(x) (x).begin(), (x).end()
  4. #define endl "\n"
  5. #define vi vector<int>
  6. #define vii vector<pair<int,int>>
  7. #define pb push_back
  8. using namespace std;
  9. using ll = long long;
  10. const ll mod = 1e9+7;
  11.  
  12. ll fac[1000001];
  13.  
  14. void pre(){
  15. fac[0]=fac[1]=1;
  16. for(int i=2;i<=1000001;i++)
  17. {
  18.  
  19. fac[i]=(fac[i-1]*1LL*i)%mod;
  20. }
  21. }
  22.  
  23. ll binpower(ll a,ll n){
  24. ll res=1;
  25. while(n){
  26.  
  27. if(n%2)
  28. res = (res*1LL*a)%mod;
  29.  
  30. n/=2;
  31. a=(a*1LL*a)%mod;
  32.  
  33. }
  34. return res;
  35.  
  36. }
  37.  
  38. ll nCrmod(ll n,ll r){
  39.  
  40.  
  41. ll res= fac[n];
  42. res = (res*1LL*binpower(fac[r],mod-2))%mod;
  43. res= (res*1LL*binpower(fac[n-r],mod-2))%mod;
  44. return res;
  45.  
  46. }
  47.  
  48. long long ncr(int n, int r) {
  49. if(r > n - r) r = n - r; // because C(n, r) == C(n, n - r)
  50. long long ans = 1;
  51. int i;
  52.  
  53. for(i = 1; i <= r; i++) {
  54. ans *= n - r + i;
  55. ans /= i;
  56. }
  57.  
  58. return ans;
  59. }
  60. ll modexp(ll a,ll b,ll m){
  61. if(b==0)return 1;
  62. if(b%2==0){
  63. ll y = modexp(a,b/2,m);
  64. return (y*y)%m;
  65. }
  66. else{
  67. return ((a%m)*modexp(a,b-1,m))%m;
  68. }
  69. }
  70.  
  71. ll modinv(ll a,ll m){
  72. return modexp(a,m-2,m);
  73. //works only for prime m.
  74. //else calculate phi(m)-1.
  75. }
  76.  
  77. void SieveOfEratosthenes(ll n)
  78. {
  79. // Create a boolean array "prime[0..n]" and initialize
  80. // all entries it as true. A value in prime[i] will
  81. // finally be false if i is Not a prime, else true.
  82. bool prime[n+1];
  83. memset(prime, true, sizeof(prime));
  84.  
  85. for (ll p=2; p*p<=n; p++)
  86. {
  87. // If prime[p] is not changed, then it is a prime
  88. if (prime[p] == true)
  89. {
  90. // Update all multiples of p greater than or
  91. // equal to the square of it
  92. // numbers which are multiple of p and are
  93. // less than p^2 are already been marked.
  94. for (ll i=p*p; i<=n; i += p)
  95. prime[i] = false;
  96. }
  97. }
  98.  
  99. // Print all prime numbers
  100. for (ll p=2; p<=n; p++)
  101. if (prime[p])
  102. cout << p << " ";
  103. }
  104.  
  105. vector<int> Centroid(vector<int>g[],int n) {
  106.  
  107. vector<int> centroid;
  108. vector<int> sz(n+1);
  109. function<void (int, int)> dfs = [&](int u, int prev) {
  110. sz[u] = 1;
  111. bool is_centroid = true;
  112. for (auto v : g[u]) if (v != prev) {
  113. dfs(v, u);
  114. sz[u] += sz[v];
  115. if (sz[v] > n / 2) is_centroid = false;
  116. }
  117. if (n - sz[u] > n / 2) is_centroid = false;
  118. if (is_centroid) centroid.push_back(u);
  119. };
  120. dfs(1, 0);
  121. return centroid;
  122. }
  123.  
  124.  
  125. int main()
  126. {
  127. ios_base::sync_with_stdio(false);
  128. cin.tie(NULL);
  129. int t;
  130. cin>>t;
  131. while(t--){
  132. int a,b;
  133. cin>>a>>b;
  134. string s;
  135. cin>>s;
  136. int n=s.size();
  137. bool ok=1;
  138. for(int i=0;i<n;i++){
  139. if(s[i]=='1'){
  140. if(s[n-i-1]=='0')ok=0;
  141. else s[n-i-1]='1';
  142. }
  143. else if(s[i]=='0'){
  144. if(s[n-i-1]=='1')ok=0;
  145. else s[n-i-1]='0';
  146. }
  147. }
  148. int o=0,z=0;
  149. for(int i=0;i<n;i++){
  150. if(s[i]=='1')o++;
  151. else if(s[i]=='1')z++;
  152. }
  153. if(z>a)ok=0;
  154. if(o>b)ok=0;
  155. cout<<z<<" "<<o<<endl;
  156. int oleft=b-o;
  157. int zleft=a-z;
  158.  
  159. for(int i=0;i<n;i++){
  160. if(i==n-i-1&&s[i]=='?'){
  161. // cout<<oleft<<" "<<zleft<<endl;
  162. if(oleft%2==1)s[i]='1',oleft--;
  163. else if(zleft%2==1)s[i]='0',zleft--;
  164. else ok=0;
  165. }
  166. else{
  167. if(s[i]=='?'){
  168. if(oleft>=2){
  169. oleft-=2;
  170. s[i]='1';
  171. s[n-i-1]='1';
  172. }
  173. else if(zleft>=2){
  174. zleft-=2;
  175. s[i]='0';
  176. s[n-i-1]='0';
  177. }
  178. else ok=0;
  179. }
  180. }
  181. }
  182. int f=0,g=0;
  183. for(int i=0;i<n;i++){
  184. if(s[i]=='0')f++;
  185. else if(s[i]=='1')g++;
  186.  
  187. }
  188. if(f!=a||g!=b)ok=0;
  189. if(!ok)cout<<-1<<endl;
  190. else cout<<s<<endl;
  191.  
  192. }
  193.  
  194.  
  195. return 0;
  196. }
  197.  
Success #stdin #stdout 0s 5328KB
stdin
1
3 4
1100011
stdout
0 4
1100011