Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ∧_∧
- ( ・ω・。)つ━☆・*。
- ⊂ ノ ・゜
- しーJ Accepted
- */
- // #pragma GCC optimize("O3")
- // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- #include <bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- #define ll long long
- #define all(x) begin(x), end(x)
- #define x first
- #define y second
- #define int long long
- using namespace std;
- using namespace __gnu_pbds;
- typedef long double ld;
- template<typename T>
- using kawaii_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
- const ld PI = atan2(0, -1);
- void seriy() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- cout << fixed << setprecision(14);
- #ifdef _offline
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- }
- const int MAXN = 1001;
- const int MAXM = 600;
- const int INF = 1e18 + 7;
- const int BASE = 47;
- const int MOD = 1e9 + 7;
- const int MAXLOG = 51;
- const ld EPS = 1e-6;
- vector<int> a_int;
- vector<bitset<MAXN>> a;
- int n;
- bitset<MAXN> b;
- void add(bitset<MAXN> &s, int pw) {
- int p = pw;
- while(p < s.size() && s[p] == 1) {
- s[p] = 0;
- p++;
- }
- s[p] = 1;
- }
- void subtract(bitset<MAXN> &s, int pw) {
- int p = pw;
- while(p < s.size() && s[p] == 0) {
- s[p] = 1;
- p++;
- }
- s[p] = 0;
- }
- // bitset<MAXN> xor1(bitset<MAXN> &a, bitset<MAXN> &b) {
- // bitset<MAXN> ans;
- // for(int i = 0; i < max(a.size(), b.size()); i++) {
- // ans[i] = ((a[i] == b[i]) ? 0 : 1);
- // }
- // return ans;
- // }
- bitset<MAXN> ans;
- bool flag = 0;
- void solve(bitset<MAXN> cur, int pw, bitset<MAXN> cur_sum) {
- if(pw > b.size()) {
- bitset<MAXN> kek = cur_sum;
- if(kek == b) {
- flag = 1;
- ans = cur;
- }
- return;
- }
- // cerr << cur << " " << pw << " " << cur_sum << " " << b << '\n';
- bitset<MAXN> kek = cur_sum;
- if(cur_sum[pw] == b[pw] || kek == b) {
- solve(cur, pw + 1, cur_sum);
- }
- if(flag) {
- return;
- }
- bitset<MAXN> sum;
- for(int i = 0; i < n; i++) {
- add(a[i], pw);
- sum ^= a[i];
- }
- bitset<MAXN> sum_c = sum;
- // cerr << cur << " " << pw << " " << b << " " << sum_c << '\n';
- if((pw < b.size() && pw < sum_c.size() && sum_c[pw] == b[pw]) || sum_c == b) {
- cur[pw] = '1';
- solve(cur, pw + 1, sum);
- }
- for(int i = 0; i < n; i++) {
- subtract(a[i], pw);
- }
- }
- signed main() {
- seriy();
- int KEK = 1;
- while(KEK--) {
- cin >> n;
- a.resize(n);
- a_int.resize(n);
- int cur_sum_int = 0;
- bitset<MAXN> cur_sum;
- for(int i = 0; i < n; i++) {
- string h;
- cin >> h;
- reverse(all(h));
- for(int j = 0; j < h.size(); j++) {
- a[i][j] = ((h[j] == '1') ? 1 : 0);
- }
- cur_sum ^= a[i];
- }
- string bb;
- cin >> bb;
- reverse(all(bb));
- for(int i = 0; i < bb.size(); i++) {
- b[i] = ((bb[i] == '1') ? 1 : 0);
- }
- bitset<MAXN> s;
- solve(s, 0, cur_sum);
- string res = "";
- cerr << ans << '\n';
- res = ans.to_string();
- reverse(all(res));
- while(res.size() && res.back() == '0') {
- res.pop_back();
- }
- reverse(all(res));
- if(!res.size()) res = "0";
- if(!flag) {
- res = "-1";
- }
- cout << res;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment