牛客国庆集训派对Day2

题目链接: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\n",ans);
    return 0;
}

  

posted @ 2018-10-03 10:48  czh~  阅读(210)  评论(0编辑  收藏  举报