GerONSo

G 100

Jan 5th, 2020
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.65 KB | None | 0 0
  1. /*
  2.  
  3. ∧_∧
  4. ( ・ω・。)つ━☆・*。
  5. ⊂  ノ    ・゜
  6. しーJ   Accepted
  7.  
  8. */
  9.  
  10.  
  11.  
  12. // #pragma GCC optimize("O3")
  13. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  14.  
  15. #include <bits/stdc++.h>
  16. #include <ext/pb_ds/assoc_container.hpp>
  17. #include <ext/pb_ds/tree_policy.hpp>
  18.  
  19. #define ll long long
  20. #define all(x) begin(x), end(x)
  21. #define x first
  22. #define y second
  23. #define int long long
  24.  
  25. using namespace std;
  26. using namespace __gnu_pbds;
  27.  
  28. typedef long double ld;
  29. template<typename T>
  30. using kawaii_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  31.  
  32. const ld PI = atan2(0, -1);
  33.  
  34. void seriy() {
  35. ios::sync_with_stdio(0);
  36. cin.tie(0);
  37. cout.tie(0);
  38. cout << fixed << setprecision(14);
  39. #ifdef _offline
  40. freopen("input.txt", "r", stdin);
  41. freopen("output.txt", "w", stdout);
  42. #endif
  43. }
  44.  
  45. const int MAXN = 1001;
  46. const int MAXM = 600;
  47. const int INF = 1e18 + 7;
  48. const int BASE = 47;
  49. const int MOD = 1e9 + 7;
  50. const int MAXLOG = 51;
  51. const ld EPS = 1e-6;
  52.  
  53. vector<int> a_int;
  54. vector<bitset<MAXN>> a;
  55. int n;
  56. bitset<MAXN> b;
  57.  
  58. void add(bitset<MAXN> &s, int pw) {
  59. int p = pw;
  60. while(p < s.size() && s[p] == 1) {
  61. s[p] = 0;
  62. p++;
  63. }
  64. s[p] = 1;
  65. }
  66.  
  67. void subtract(bitset<MAXN> &s, int pw) {
  68. int p = pw;
  69. while(p < s.size() && s[p] == 0) {
  70. s[p] = 1;
  71. p++;
  72. }
  73. s[p] = 0;
  74. }
  75.  
  76. // bitset<MAXN> xor1(bitset<MAXN> &a, bitset<MAXN> &b) {
  77. // bitset<MAXN> ans;
  78. // for(int i = 0; i < max(a.size(), b.size()); i++) {
  79. // ans[i] = ((a[i] == b[i]) ? 0 : 1);
  80. // }
  81. // return ans;
  82. // }
  83.  
  84. bitset<MAXN> ans;
  85. bool flag = 0;
  86.  
  87. void solve(bitset<MAXN> cur, int pw, bitset<MAXN> cur_sum) {
  88. if(pw > b.size()) {
  89. bitset<MAXN> kek = cur_sum;
  90. if(kek == b) {
  91. flag = 1;
  92. ans = cur;
  93. }
  94. return;
  95. }
  96. // cerr << cur << " " << pw << " " << cur_sum << " " << b << '\n';
  97. bitset<MAXN> kek = cur_sum;
  98. if(cur_sum[pw] == b[pw] || kek == b) {
  99. solve(cur, pw + 1, cur_sum);
  100. }
  101. if(flag) {
  102. return;
  103. }
  104. bitset<MAXN> sum;
  105. for(int i = 0; i < n; i++) {
  106. add(a[i], pw);
  107. sum ^= a[i];
  108. }
  109. bitset<MAXN> sum_c = sum;
  110. // cerr << cur << " " << pw << " " << b << " " << sum_c << '\n';
  111. if((pw < b.size() && pw < sum_c.size() && sum_c[pw] == b[pw]) || sum_c == b) {
  112. cur[pw] = '1';
  113. solve(cur, pw + 1, sum);
  114. }
  115. for(int i = 0; i < n; i++) {
  116. subtract(a[i], pw);
  117. }
  118. }
  119.  
  120. signed main() {
  121. seriy();
  122. int KEK = 1;
  123. while(KEK--) {
  124. cin >> n;
  125. a.resize(n);
  126. a_int.resize(n);
  127. int cur_sum_int = 0;
  128. bitset<MAXN> cur_sum;
  129. for(int i = 0; i < n; i++) {
  130. string h;
  131. cin >> h;
  132. reverse(all(h));
  133. for(int j = 0; j < h.size(); j++) {
  134. a[i][j] = ((h[j] == '1') ? 1 : 0);
  135. }
  136. cur_sum ^= a[i];
  137. }
  138. string bb;
  139. cin >> bb;
  140. reverse(all(bb));
  141. for(int i = 0; i < bb.size(); i++) {
  142. b[i] = ((bb[i] == '1') ? 1 : 0);
  143. }
  144. bitset<MAXN> s;
  145. solve(s, 0, cur_sum);
  146. string res = "";
  147. cerr << ans << '\n';
  148. res = ans.to_string();
  149. reverse(all(res));
  150. while(res.size() && res.back() == '0') {
  151. res.pop_back();
  152. }
  153. reverse(all(res));
  154. if(!res.size()) res = "0";
  155. if(!flag) {
  156. res = "-1";
  157. }
  158. cout << res;
  159. }
  160. return 0;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment