Advertisement
GerONSo

Untitled

Jan 5th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.08 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 = 3e5 + 100;
  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<string> a;
  55. int n;
  56. string b;
  57. int b_int, ans_int = -1;
  58.  
  59. int dec(string s) {
  60. int sum = 0;
  61. for(int i = 0; i < s.size(); i++) {
  62. if(s[i] == '1') {
  63. sum += (1ll << i);
  64. }
  65. }
  66. return sum;
  67. }
  68.  
  69. string bin(int a) {
  70. string t = "";
  71. bool f = 0;
  72. for(int i = MAXLOG; i >= 0; i--) {
  73. if(a >= (1ll << i)) {
  74. f = 1;
  75. t += '1';
  76. a -= (1ll << i);
  77. }
  78. else if(f) {
  79. t += '0';
  80. }
  81. }
  82. if(t.size() == 0) t = "0";
  83. return t;
  84. }
  85.  
  86. void add(string &s, int pw) {
  87. int p = pw;
  88. while(s.size() - 1 < p) {
  89. s += '0';
  90. }
  91. while(p < s.size() && s[p] == '1') {
  92. s[p] = '0';
  93. p++;
  94. }
  95. // cerr << s << " " << p << '\n';
  96. if(p < s.size()) {
  97. s[p] = '1';
  98. }
  99. else {
  100. s += '1';
  101. }
  102. }
  103.  
  104. void subtract(string &s, int pw) {
  105. int p = pw;
  106. while(p < s.size() && s[p] == '0') {
  107. s[p] = '1';
  108. p++;
  109. }
  110. s[p] = '0';
  111. }
  112.  
  113. string xor1(string &a, string &b) {
  114. string ans;
  115. ans.resize(max(a.size(), b.size()), '0');
  116. for(int i = 0; i < max(a.size(), b.size()); i++) {
  117. if(i < min(a.size(), b.size())) {
  118.  
  119. }
  120. else if(a.size() < b.size()) {
  121. a += '0';
  122. }
  123. else if(a.size() > b.size()){
  124. b += '0';
  125. }
  126. ans[i] = ((a[i] == b[i]) ? '0' : '1');
  127. }
  128. return ans;
  129. }
  130.  
  131. string ans = "-1";
  132.  
  133. void solve(string cur, int pw, string cur_sum) {
  134. if(pw > b.size()) {
  135. string kek = cur_sum;
  136. while(kek.back() == '0') {
  137. kek.pop_back();
  138. }
  139. if(!kek.size()) {
  140. kek = "0";
  141. }
  142. if(kek == b) {
  143. ans = cur;
  144. }
  145. return;
  146. }
  147. cerr << cur << " " << cur_sum << '\n';
  148.  
  149. if(cur_sum[pw] == b[pw]) {
  150. solve(cur, pw + 1, cur_sum);
  151. }
  152. if(ans != "-1") {
  153. return;
  154. }
  155. string sum = "0";
  156. for(int i = 0; i < n; i++) {
  157. add(a[i], pw);
  158. sum = xor1(sum, a[i]);
  159. }
  160. string sum_c = sum;
  161. while(sum_c.back() == '0') {
  162. sum_c.pop_back();
  163. }
  164. // cerr << sum << " " << pw << '\n';
  165. if(sum_c[pw] == b[pw]) {
  166. cur[pw] = '1';
  167. solve(cur, pw + 1, sum);
  168. }
  169. for(int i = 0; i < n; i++) {
  170. subtract(a[i], pw);
  171. }
  172. }
  173.  
  174. void solve2(int cur, int pw, int cur_sum) {
  175. if(pw > b.size()) {
  176. if(cur_sum == b_int) {
  177. ans_int = cur;
  178. }
  179. return;
  180. }
  181. cerr << cur << " " << cur_sum << " " << bin(cur) << " " << bin(cur_sum) << '\n';
  182. if(((cur_sum >> pw) & 1) == ((b_int >> pw) & 1)) {
  183. solve2(cur, pw + 1, cur_sum);
  184. }
  185. if(ans_int != -1) {
  186. return;
  187. }
  188. int sum = 0;
  189. for(int i = 0; i < n; i++) {
  190. a_int[i] += (1ll << pw);
  191. sum ^= a_int[i];
  192. }
  193. if(((sum >> pw) & 1) == ((b_int >> pw) & 1)) {
  194. cur += (1ll << pw);
  195. solve2(cur, pw + 1, sum);
  196. }
  197. for(int i = 0; i < n; i++) {
  198. a_int[i] -= (1ll << pw);
  199. }
  200. }
  201.  
  202. signed main() {
  203. seriy();
  204. cin >> n;
  205. a.resize(n);
  206. a_int.resize(n);
  207. int cur_sum_int = 0;
  208. string cur_sum = "0";
  209. for(int i = 0; i < n; i++) {
  210. string h;
  211. cin >> h;
  212. a[i] = h;
  213. reverse(all(a[i]));
  214. a_int[i] = dec(a[i]);
  215. cur_sum_int ^= a_int[i];
  216. cur_sum = xor1(cur_sum, a[i]);
  217. }
  218. string bb;
  219. cin >> bb;
  220. b = bb;
  221. reverse(all(b));
  222. b_int = dec(b);
  223. string s;
  224. s.resize(b.size(), '0');
  225. solve(s, 0, cur_sum);
  226. cerr << '\n';
  227. solve2(0, 0, cur_sum_int);
  228. while(ans.back() == '0') {
  229. ans.pop_back();
  230. }
  231. reverse(all(ans));
  232. if(ans == "1-") ans = "-1";
  233. if(!ans.size()) ans = "0";
  234. // cout << ((ans_int == -1) ? "-1" : bin(ans_int)) << '\n';
  235. cout << ans;
  236. // cout << ((ans == "-1") ? "-1" : ans);
  237. return 0;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement