CF1977D XORificator
題意
給你一個二進位制(僅由 \(0\) 和 \(1\) 組成)\(n \times m\) 矩陣。你可以進行以下操作任意次:反轉某一行中的所有值(即用 \(1\) 替換 \(0\),用 \(0\) 替換 \(1\))。
矩陣中的某一列如果只包含一個 \(1\),則被視為特殊列。你的任務是找出最多有多少列可以同時被特殊化,以及為達到這一目的應在哪幾行反轉。
\(1\le nm\le 3\times 10^5\)
題解
我們發現,如果我們欽定第 \(j\) 列的第 \(i\) 行位置為 \(1\),其他行位置為 \(0\)。會發現其實我們確定了整個矩陣。它的反轉方式也是唯一確定的。
於是可以考慮列舉每一列,得到欽定某一個位置為 \(1\) 時哪些行需要反轉。
在最多列出現的反轉方案就是答案。於是我們可以將一種反轉方案雜湊起來,放入 map
進行統計,這裡我用的隨機權值異或的雜湊方法。
接著考慮如何 \(\mathcal O(1)\) 求出反轉方案的雜湊值。
可以統計前字尾的雜湊值,為 \(1\) 視作反轉,為 \(0\) 視作不反轉,一個位置為 \(1\) 的反轉方案應該為前字尾的反轉方案加上這一位的相反狀態。
於是我們就可以 \(\mathcal O(nm)\) 的解決掉這道題。
總結
-
找供需關係
看答案的貢獻並找到使得這個貢獻進入答案的要求