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
6
数组统计也用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; }