Advertisement
GerONSo

G 76

Jan 5th, 2020
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.72 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. // cerr << cur << " " << cur_sum << '\n';
  143. if(kek == b) {
  144. ans = cur;
  145. }
  146. return;
  147. }
  148. string kek = cur_sum;
  149. while(kek.back() == '0') {
  150. kek.pop_back();
  151. }
  152. if(!kek.size()) {
  153. kek = "0";
  154. }
  155. while(cur_sum.size() < b.size()) {
  156. cur_sum += '0';
  157. }
  158. // cerr << cur << " " << ?cur_sum << " " << b << " " << kek << '\n';
  159. if((pw < b.size() && pw < cur_sum.size() && cur_sum[pw] == b[pw]) || kek == b) {
  160. solve(cur, pw + 1, cur_sum);
  161. }
  162. if(ans != "-1") {
  163. return;
  164. }
  165. string sum = "0";
  166. for(int i = 0; i < n; i++) {
  167. add(a[i], pw);
  168. sum = xor1(sum, a[i]);
  169. }
  170. string sum_c = sum;
  171. while(sum_c.back() == '0') {
  172. sum_c.pop_back();
  173. }
  174. if(sum_c.size() == 0) {
  175. sum_c = "0";
  176. }
  177. while(sum_c.size() < b.size()) {
  178. sum_c += '0';
  179. }
  180. // cerr << cur << " " << pw << " " << b << " " << sum_c << '\n';
  181. if((pw < b.size() && pw < sum_c.size() && sum_c[pw] == b[pw]) || sum_c == b) {
  182. cur[pw] = '1';
  183. solve(cur, pw + 1, sum);
  184. }
  185. for(int i = 0; i < n; i++) {
  186. subtract(a[i], pw);
  187. }
  188. }
  189.  
  190. void solve2(int cur, int pw, int cur_sum) {
  191. if(pw > b.size()) {
  192. if(cur_sum == b_int) {
  193. ans_int = cur;
  194. }
  195. return;
  196. }
  197. // cerr << cur << " " << cur_sum << " " << bin(cur) << " " << bin(cur_sum) << '\n';
  198. if(((cur_sum >> pw) & 1) == ((b_int >> pw) & 1)) {
  199. solve2(cur, pw + 1, cur_sum);
  200. }
  201. if(ans_int != -1) {
  202. return;
  203. }
  204. int sum = 0;
  205. for(int i = 0; i < n; i++) {
  206. a_int[i] += (1ll << pw);
  207. sum ^= a_int[i];
  208. }
  209. if(((sum >> pw) & 1) == ((b_int >> pw) & 1)) {
  210. cur += (1ll << pw);
  211. solve2(cur, pw + 1, sum);
  212. }
  213. for(int i = 0; i < n; i++) {
  214. a_int[i] -= (1ll << pw);
  215. }
  216. }
  217.  
  218. signed main() {
  219. seriy();
  220. int KEK = 1;
  221. while(KEK--) {
  222. cin >> n;
  223. a.resize(n);
  224. a_int.resize(n);
  225. int cur_sum_int = 0;
  226. string cur_sum = "0";
  227. for(int i = 0; i < n; i++) {
  228. string h;
  229. cin >> h;
  230. a[i] = h;
  231. reverse(all(a[i]));
  232. a_int[i] = dec(a[i]);
  233. cur_sum_int ^= a_int[i];
  234. cur_sum = xor1(cur_sum, a[i]);
  235. }
  236. string bb;
  237. cin >> bb;
  238. b = bb;
  239. reverse(all(b));
  240. b_int = dec(b);
  241. string s;
  242. s.resize(b.size() + 1, '0');
  243. solve(s, 0, cur_sum);
  244. solve2(0, 0, cur_sum_int);
  245. while(ans.back() == '0') {
  246. ans.pop_back();
  247. }
  248. reverse(all(ans));
  249. if(ans == "1-") ans = "-1";
  250. if(!ans.size()) ans = "0";
  251. string res = ((ans_int == -1) ? "-1" : bin(ans_int));
  252. cout << ans;
  253. }
  254. return 0;
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement