#include <iostream> #include <vector> using namespace std; const int mx = 1001; int a[mx], b[mx]; int n, m; int ans[36]; inline bool getBit(long long num, int i) { return (num & (1LL << i)) != 0; } inline void setBit(long long& num, int i) { num |= (1LL << i); } inline void clearBit(long long& num, int i) { num &= (~(1LL << i)); } inline void toggleBit(long long& num, int i) { num ^= (1LL << i); } int countSetBits(long long num) { int counter = 0; while (num) { counter += num & 1; num >>= 1; } return counter; } void printBinary(long long num) { for (int i = 63; i >= 0; --i) { cout << getBit(num, i); } cout << std::endl; } vector<long long> candidates[2]; int main() { ios::sync_with_stdio(false); cin >> n >> m; for (int i = 0; i < m; ++i) { cin >> a[i] >> b[i]; } for (int i = 0; i < n; ++i) { long long actual = 0; setBit(actual, i); candidates[0].push_back(actual); for (int j = i + 1; j < n; ++j) { setBit(actual, j); candidates[0].push_back(actual); } } int index = 0; int last = 1; for (int i = m - 1; i >= 0; --i) { index = 1 - index; last = 1 - index; candidates[index].clear(); candidates[index].reserve(candidates[last].size()); int x = a[i] - 1; int y = b[i] - 1; for (int j = 0; j < candidates[last].size(); ++j) { bool x_bit = getBit(candidates[last][j], x); bool y_bit = getBit(candidates[last][j], y); if ((!x_bit) || y_bit) { candidates[index].push_back(candidates[last][j]); } if ((!x_bit) && y_bit) { long long actual = candidates[last][j]; toggleBit(actual, x); toggleBit(actual, y); candidates[index].push_back(actual); } } } for (int i = 0; i < candidates[index].size(); ++i) { long long num = candidates[index][i]; for (int j = 0; j < m; ++j) { int x = a[j] - 1; int y = b[j] - 1; bool x_bit = getBit(num, x); bool y_bit = getBit(num, y); if (x_bit && (!y_bit)) { toggleBit(num, x); toggleBit(num, y); } } int num_of_bits = countSetBits(num); ans[num_of_bits] = 1 - ans[num_of_bits]; } for (int i = 1; i <= n; ++i) { cout << ans[i] << " "; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #include <iostream> #include <vector> using namespace std; const int mx = 1001; int a[mx], b[mx]; int n, m; int ans[36]; inline bool getBit(long long num, int i) { return (num & (1LL << i)) != 0; } inline void setBit(long long& num, int i) { num |= (1LL << i); } inline void clearBit(long long& num, int i) { num &= (~(1LL << i)); } inline void toggleBit(long long& num, int i) { num ^= (1LL << i); } int countSetBits(long long num) { int counter = 0; while (num) { counter += num & 1; num >>= 1; } return counter; } void printBinary(long long num) { for (int i = 63; i >= 0; --i) { cout << getBit(num, i); } cout << std::endl; } vector<long long> candidates[2]; int main() { ios::sync_with_stdio(false); cin >> n >> m; for (int i = 0; i < m; ++i) { cin >> a[i] >> b[i]; } for (int i = 0; i < n; ++i) { long long actual = 0; setBit(actual, i); candidates[0].push_back(actual); for (int j = i + 1; j < n; ++j) { setBit(actual, j); candidates[0].push_back(actual); } } int index = 0; int last = 1; for (int i = m - 1; i >= 0; --i) { index = 1 - index; last = 1 - index; candidates[index].clear(); candidates[index].reserve(candidates[last].size()); int x = a[i] - 1; int y = b[i] - 1; for (int j = 0; j < candidates[last].size(); ++j) { bool x_bit = getBit(candidates[last][j], x); bool y_bit = getBit(candidates[last][j], y); if ((!x_bit) || y_bit) { candidates[index].push_back(candidates[last][j]); } if ((!x_bit) && y_bit) { long long actual = candidates[last][j]; toggleBit(actual, x); toggleBit(actual, y); candidates[index].push_back(actual); } } } for (int i = 0; i < candidates[index].size(); ++i) { long long num = candidates[index][i]; for (int j = 0; j < m; ++j) { int x = a[j] - 1; int y = b[j] - 1; bool x_bit = getBit(num, x); bool y_bit = getBit(num, y); if (x_bit && (!y_bit)) { toggleBit(num, x); toggleBit(num, y); } } int num_of_bits = countSetBits(num); ans[num_of_bits] = 1 - ans[num_of_bits]; } for (int i = 1; i <= n; ++i) { cout << ans[i] << " "; } return 0; } |