牛客國慶集訓派對Day2
阿新 • • 發佈:2018-12-13
題意:
給你兩個矩陣,做乘法之後,算出所有元素異或後的答案。
POINT:
把N x P, P x M的兩個矩陣,都對p分為每8個一份。
對n行的p個數,每8個數一組,把所有選取的狀態全部處理出來,8個數選或不選,就是2^8=256種情況。
算出每種狀態的和。效率為o(n*p*256)。
然後把第二個矩陣也8個8個處理,不過這8個01就是我們對應的狀態了。
然後對於每一行(1-n),這p/8個數,對應的狀態直接套上,相當於O1查詢了。
#include <stdio.h> #include <vector> #include <iostream> #include <algorithm> #include <string.h> #include <queue> using namespace std; #define LL long long const int N = 1111+55; int sum[4100][10][300]; int kind[4100][10]; int b[4100][70]; int a[4100][70]; int main() { int n,p,m; scanf("%d%d%d",&n,&p,&m); for(int i=0;i<n;i++){ for(int j=0;j<p;j++){ scanf("%x",&a[i][j]); } } for(int i=0;i<m;i++){ char s[70]; scanf("%s",s); for(int j=0;j<p;j++){ b[i][j]=s[j]-'0'; } } p=(p-1)/8+1; for(int i=0;i<n;i++){ for(int j=0;j<p;j++){ int pos=j*8; for(int k=0;k<256;k++){ int s=0; for(int x=0;x<8;x++){ if(k&(1<<x)) s+=a[i][pos+x]; } sum[i][j][k]=s; } } } for(int i=0;i<m;i++){ for(int j=0;j<p;j++){ int pos=j*8; int now=0; for(int k=0;k<8;k++){ if(b[i][pos+k]) now|=1<<k; } kind[i][j]=now; } } int ans=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ int s=0; for(int k=0;k<p;k++){ s+=sum[i][k][kind[j][k]]; } ans=ans^s; } } printf("%d\n",ans); }