CF1977D XORificator

CF1977D XORificator

题意

给你一个二进制(仅由 01 组成)n×m 矩阵。你可以进行以下操作任意次:反转某一行中的所有值(即用 1 替换 0,用 0 替换 1)。

矩阵中的某一列如果只包含一个 1,则被视为特殊列。你的任务是找出最多有多少列可以同时被特殊化,以及为达到这一目的应在哪几行反转。

1nm3×105

题解

我们发现,如果我们钦定第 j 列的第 i 行位置为 1,其他行位置为 0。会发现其实我们确定了整个矩阵。它的反转方式也是唯一确定的。

于是可以考虑枚举每一列,得到钦定某一个位置为 1 时哪些行需要反转。

在最多列出现的反转方案就是答案。于是我们可以将一种反转方案哈希起来,放入 map 进行统计,这里我用的随机权值异或的哈希方法。

接着考虑如何 O(1) 求出反转方案的哈希值。

可以统计前后缀的哈希值,为 1 视作反转,为 0 视作不反转,一个位置为 1 的反转方案应该为前后缀的反转方案加上这一位的相反状态。

于是我们就可以 O(nm) 的解决掉这道题。

总结

  • 找供需关系

    看答案的贡献并找到使得这个贡献进入答案的要求

作者:lupengheyyds

出处:https://www.cnblogs.com/lupengheyyds/p/18537297

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   lupengheyyds  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示