某变换好题。不过听说还有O(2^n*n^2)DP的……

Description

  给定一个n*m的01矩阵,你可以选择对任意行和任意列取反,使得最终“1”的数量尽量少。

Input

  第一行两个整数n,m。
  接下来n行,每行m个字符,描述一个01矩阵。

Output

  一个整数表示最少的1的数量。

Sample Input

  3 4
  0110
  1010
  0111

Sample Output

  2

HINT

  1 <= n <= 20,1 <= m <= 100000。

Solution

  首先发现矩阵只有20行,经过一番脑补,可以把这二十行压成一个数。

  然后我们就得到了m个数。

  然后在行上的取反就相当于将这m个数同时异或上同一个数。

  然后我们要求的就是,找出一个数,使得这m个数同时异或上这个数后,每个数的二进制位中的0和1的个数的最小值总和最小。

  我们设ans[x]为当异或的数为x时的答案,a数组用来存放m个数,d[x]为x的二进制位中0和1的个数的最小值。

  所以:

    

  我们稍微改一改,用w[x]表示在m个数中,为x的数有多少个:

    

  等等,是不是发现了什么?这不就是卷积FWT的式子吗?

    

  时间复杂度O(nm+2^n*n)。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define MS 23
#define MN 100005
#define MM 1100005
using namespace std;
char c[MS][MN];
int a[MN];
ll A[MM],B[MM],C[MM];
int n,m,ans; inline int read()
{
int n=,f=; char c=getchar();
while (c<'' || c>'') {if(c=='-')f=-; c=getchar();}
while (c>='' && c<='') {n=n*+c-''; c=getchar();}
return n*f;
} void FWT(ll* a,int len,bool g)
{
register int wt,st,i;
ll x,y;
for (wt=;wt<len;wt<<=)
for (st=;st<len;st+=wt<<)
for (i=;i<wt;++i)
{
x=a[st+i]; y=a[st+wt+i];
a[st+i]=x+y; a[st+wt+i]=x-y;
if (g) a[st+i]>>=,a[st+wt+i]>>=;
}
} int main()
{
register int i,j;
n=read(); m=read(); ans=n*m;
for (i=;i<n;++i) scanf("%s",c[i]+);
for (i=n-;i>=;--i)
for (j=;j<=m;++j) a[j]=(a[j]<<)+c[i][j]-'';
for (i=;i<=m;++i) ++A[a[i]];
for (i=;i<(<<n);++i) B[i]=B[i>>]+(i&);
for (i=;i<(<<n);++i) B[i]=min(B[i],n-B[i]);
FWT(A,<<n,false); FWT(B,<<n,false);
for (i=;i<(<<n);++i) C[i]=A[i]*B[i];
FWT(C,<<n,true);
for (i=;i<(<<n);++i) ans=min(ans,(int)C[i]);
printf("%d",ans);
}

Last Word

  如果把FWT中的if语句改成(x+y)/g,(x-y)/g,效率会慢5倍,除法真是个可怕的东西。

[Codeforces]663E Binary Table的更多相关文章

  1. [CodeForces 663E] - Binary Table(FWT)

    题目 Codeforces 题目链接 分析 大佬博客,写的很好 本蒟蒻就不赘述了,就是一个看不出来的异或卷积 精髓在于 mask对sta的影响,显然操作后的结果为mask ^ sta AC code ...

  2. Codeforces #662C Binary Table

    听说这是一道$ Tourist$现场没出的题 Codeforces #662C 题意: 给定$n*m的 01$矩阵,可以任意反转一行/列($0$变$1$,$1$变$0$),求最少$ 1$的数量 $ n ...

  3. Codeforces.662C.Binary Table(状压 FWT)

    题目链接 \(Description\) 给定一个\(n\times m\)的\(01\)矩阵,你可以选择一些行和一些列并将其中所有的\(01\)反转.求操作后最少剩下多少个\(1\). \(n\le ...

  4. CodeForces - 662C Binary Table (FWT)

    题意:给一个N*M的0-1矩阵,可以进行若干次操作,每次操作将一行或一列的0和1反转,求最后能得到的最少的1的个数. 分析:本题可用FWT求解. 因为其0-1反转的特殊性且\(N\leq20\),将每 ...

  5. CROC 2016 - Final Round [Private, For Onsite Finalists Only] C. Binary Table FWT

    C. Binary Table 题目连接: http://codeforces.com/problemset/problem/662/C Description You are given a tab ...

  6. Codeforces 417E Square Table(随机算法)

    题目链接:Codeforces 417E Square Table 题目大意:给出n和m.要求给出一个矩阵,要求每一列每一行的元素的平方总和是一个平方数. 解题思路:构造.依照 a a a b a a ...

  7. 【CF662C】Binary Table(FWT)

    [CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可 ...

  8. 【CF662C】Binary Table 按位处理

    [CF662C]Binary Table 题意:给你一个$n\times m$的01网格,你可以进行任意次操作,每次操作是将一行或一列的数都取反,问你最多可以得到多少个1? $n\le 20,m\le ...

  9. CodeForces 1251B --- Binary Palindromes

    [CodeForces 1251B --- Binary Palindromes] Description A palindrome is a string t which reads the sam ...

随机推荐

  1. nyoj 过河问题

    过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的 ...

  2. java排序算法之冒泡排序(Bubble Sort)

    java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...

  3. 剑指offer-数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  4. AngularJS1.X学习笔记7-过滤器

    最近参加笔试被虐成狗了,感觉自己的算法太弱了.但是还是先花点事件将这个AngularJS学习完.今天学习filter 一.内置过滤器 (1)过滤单个数据值 <!DOCTYPE html> ...

  5. 算法题丨Two Sum

    描述 Given an array of integers, return indices of the two numbers such that they add up to a specific ...

  6. node express将请求重定向为https

    项目开发时,由于服务器只接受https请求(运维说了算...),所以在生产环境时,要把所有http请求全都重定向为https,具体操作是在app.js文件里加入以下代码: var express = ...

  7. 我做的python常用的小技巧

    在python编码过程中,总会遇到各种各样的小问题,我想着记录下来,以备查用,总结过去,是为了更好的思考与进步. 一. 去除变量中(标题中)多余的字符 数据处理过程中,遇到这样的情况: y=['月份' ...

  8. Hadoop API:遍历文件分区目录,并根据目录下的数据进行并行提交spark任务

    hadoop api提供了一些遍历文件的api,通过该api可以实现遍历文件目录: import java.io.FileNotFoundException; import java.io.IOExc ...

  9. python模块之PIL模块

    PIL简介 什么是PIL PIL:是Python Image Library的缩写,图像处理的模块.主要的类包括Image,ImageFont,ImageDraw,ImageFilter PIL的导入 ...

  10. LabelFrame

    LabelFrame组件是Frame组件的变体. 默认情况下,LabelFrame会在其子组件的周围绘制一个边框以及一个标题. 何时使用LabelFrame组件?当你想要奖一些相关的组件分为一组的时候 ...