[洛谷P2447][SDOI2010]外星千足蟲
阿新 • • 發佈:2018-12-01
題目大意:有$n$個數,每個數為$0$或$1$,給你其中一些關係,一個關係形如其中幾個數的異或和是多少,問最少知道前幾個關係就可以得出每個數是什麼,並輸出每個數
題解:異或方程組,和高斯消元差不多,就是把加減改成了異或。
卡點:用$bitset$優化,輸出時輸反了
C++ Code:
#include <algorithm> #include <iostream> #include <bitset> #define maxn 1010 #define maxm 2010 int n, m, ans; std::bitset<maxn> s[maxm]; int main() { std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0); std::cin >> n >> m; for (int i = 1, x; i <= m; i++) { std::cin >> s[i] >> x; s[i] <<= 1; s[i][n + 1] = x; } for (int i = 1, pos; i <= n; i++) { for (pos = i; pos <= m; pos++) if (s[pos][i]) break; if (pos > m) { std::cout << "Cannot Determine\n"; return 0; } ans = std::max(ans, pos); std::swap(s[i], s[pos]); for (int j = 1; j <= m; j++) if (i != j && s[j][i]) s[j] ^= s[i]; } std::cout << ans << '\n'; for (int i = n; i; i--) std::cout << (s[i][n + 1] ? "?y7M#\n" : "Earth\n"); return 0; }