首先,一定要纠正自己的惯性思维。
不要老是认为只有最后一行的m<=20,,,最后一行不是100%,难道不是全部数据吗???黑人问号脸,所以我前一个小时各种字符串,各种字符数组到底在干嘛???
行吧,这里位运算,发现一个很笨的自己
for(int j=0;j<m;j++)
k=k*2+1;
麻烦自己把它优化成
k = (1<<m) -1;
其实,从看到题目就知道是位运算了,就是没看到于m<=20,老想着,哎呀这个表示答案的整数太大了怎么办,
麻烦我这只小猪想想2^20才多大。。。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=2000005;
const int maxn2=50005;
int judge[maxn]={0};
int s[maxn2]={0};
int main()
{
int n,m,k=0;
cin>>n>>m;
for(int i=0;i<n;i++)//maxn2
{
for(int j=0;j<m;j++)//maxn1
{
int temp;
cin>>temp;
s[i]=s[i]*2+temp;
}
judge[s[i]]++;
}
// for(int j=0;j<m;j++)
// k=k*2+1;
k = (1<<m) -1;
// cout<<"k:"<<k<<endl;
int cnt=0;
for(int i=0;i<n;i++)
{
int temp=s[i];
// cout<<temp<<" ";
temp = temp ^ k;
cnt+=judge[temp];
}
cout<<cnt/2<<endl;
}
又瞎写了一个blog....