2017轻工业校赛 密室逃脱 异或运算 https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2133

Description

XOR在玩密室逃脱,在某一关中,桌上有一个一张纸,上面写着“请根据所给例子求解答案从而获得密码”,下面写了几个字符串“01 10 11”,而答案为“6”,聪明的XOR立马就知道了这是给出一些二进制数字S,求存在多少对有序二元组(i,j)使得S[i]^S[j]<S[i],现在还有T组数据,每组是n个长度为m的二进制数字,聪明的XOR立马开始动手求解答案。

Input

第一行一个整数T,表示数据组数。

对于每组数据,首先读入两个整数n,m(n*m<=1000000),接下来为n行,每行为一个长度为m的01串,表示一个二进制数字

Output

对于每个数据,输出一个整数x,表示二元组数目

Sample Input

1 3 2 01 10 11

Sample Output

 
数组统计也用long long   不然就会错   鬼知道我经历了什么
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<vector>
#include<math.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define N 1000009
char str[N];
LL w[N],ww[N];
int main()
{
    int T,n,m;
    scanf("%d",&T);
    while(T--)
    {
        memset(w,0,sizeof(w));
        memset(ww,0,sizeof(ww));
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
        {
            scanf("%s",str);
            int t=0;
            for(int j=0;j<m;j++)
            {
                if(str[j]=='1'&&!t)
                {
                    w[j]++;
                    t=1;
                }
                if(str[j]=='1')
                    ww[j]++;
            }
        }
        LL sum=0;
        for(int i=0;i<m;i++)
            sum+=w[i]*ww[i];
        printf("%lld
",sum);
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/a719525932/p/6724856.html