题目链接:https://www.nowcoder.com/acm/contest/202/A
-
A
题意:给出最大4096*64和64*4096的矩阵,其中有一个矩阵只含有0和1,问你它们相乘所得到得矩阵所有元素异或
思路:一开始我想到的是能不能将01矩阵的一排都用二进制表示,但是发现2的64次方大于4096,反而增大了复杂度,于是没有做出这题,题解是将矩阵分块,最多分成8块,这样01矩阵的种数有255种,然后再暴力求解,看起来很难写,但是捋清楚思路和写法,这题不难写
#include <cstdio> #include <iostream> #include <cstring> #include <ctime> #include <cstdlib> #include <vector> #include <stack> #include <algorithm> #include <map> #include <queue> using namespace std; #define ll long long const int maxn=4096+10; int A[maxn][70]; int B[maxn][70]; int de[maxn][10][(1<<8)+10]; int main() { int n,p,m; cin>>n>>p>>m; for(int i=1; i<=n; i++) { for(int j=1; j<=p; j++) { string a; cin>>a; int l=1; for(int k=a.size()-1; k>=0; k--) { if(a[k]>='0'&&a[k]<='9') A[i][j]+=(a[k]-'0')*l; else A[i][j]+=(a[k]-'A'+10)*l; l*=16; } // cout<<A[i][j]<<endl; } } for(int i=1; i<=m; i++) { for(int j=1; j<=p; j++) { scanf("%1d",&B[i][j]); } } int len=p/8+(p%8!=0); // cout<<len<<endl; for(int i=1; i<=n; i++) { for(int j=1; j<=len; j++) { for(int k=0; k<(1<<8); k++) { for(int t=0; t<8; t++) { if(k&(1<<t))de[i][j][k]+=A[i][t+1+(j-1)*8]; } } } } int ans=0; for(int nn=1; nn<=n; nn++) { for(int i=1; i<=m; i++) { int d=0; for(int j=1; j<=len; j++) { int g=0; for(int k=1; k<=8; k++) { g+=B[i][(j-1)*8+k]*(1LL<<(k-1)); } // cout<<g<<endl; // cout<<g<<endl; d+=de[nn][j][g]; } //cout<<d<<endl; ans^=d; // cout<<ans<<endl; } } printf("%d ",ans); return 0; }