zoukankan      html  css  js  c++  java
  • 牛客国庆集训派对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
    ",ans);
        return 0;
    }
    

      

  • 相关阅读:
    flume自定义source
    flume自定义sink之文件
    - Exception follows. org.apache.flume.FlumeException: java.net.BindException: Address already in use
    flume自定义sink之mysql
    Vue 【事件&样式】样式
    选择器
    rem
    表格和表单
    双飞翼布局、圣杯布局
    三栏布局
  • 原文地址:https://www.cnblogs.com/carcar/p/9739343.html
Copyright © 2011-2022 走看看