度度熊为了完成毕业论文,需要收集一些数据来支撑他的论据,于是设计了一份包含 mm 个问题的调查问卷,每个问题只有 'A' 和 'B' 两种选项。
将问卷散发出去之后,度度熊收到了 nn 份互不相同的问卷,在整理结果的时候,他发现可以只保留其中的一部分问题,使得这 nn 份问卷仍然是互不相同的。这里认为两张问卷是不同的,当且仅当存在至少一个被保留的问题在这两份问卷中的回答不同。
现在度度熊想知道,存在多少个问题集合,使得这 nn 份问卷在只保留这个集合的问题之后至少有 kk 对问卷是不同的。
第一行包含一个整数 TT,表示有 TT 组测试数据。
接下来依次描述 TT 组测试数据。对于每组测试数据:
第一行包含三个整数 nn,mm 和 kk,含义同题目描述。
接下来 nn 行,每行包含一个长度为 mm 的只包含 'A' 和 'B' 的字符串,表示这份问卷对每个问题的回答。
保证 1 \leq T \leq 1001≤T≤100,1 \leq n \leq 10^31≤n≤103,1 \leq m \leq 101≤m≤10,1 \leq k \leq 10^61≤k≤106,给定的 nn 份问卷互不相同。
对于每组测试数据,输出一行信息 "Case #x: y"(不含引号),其中 x 表示这是第 xx 组测试数据,y 表示满足条件的问题集合的个数,行末不要有多余空格。
2 2 2 1 AA BB 2 2 2 AA BB
Case #1: 3 Case #2: 0
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <utility> 6 #include <algorithm> 7 #include <vector> 8 #include <queue> 9 #include <stack> 10 using namespace std; 11 #define max(x,y) x>=y?x:y 12 #define lowbit(x) x&(-x) 13 #define ll long long 14 #define mem(a,b) memset(a,b,sizeof(a)); 15 char s[1009][15]; 16 int num[1200]; 17 int ans,t; 18 int n,m,k; 19 int main() 20 { 21 scanf("%d",&t); 22 for(int i=1;i<=t;i++) 23 { 24 scanf("%d%d%d",&n,&m,&k); 25 for(int i=0;i<n;i++){ 26 scanf("%s",s[i]); 27 } 28 ans=0; 29 for(int x=1;x<(1<<m);x++){//例如m==2: 01 10 11 30 mem(num,0); 31 int ret=0; 32 for(int i=0;i<n;i++){ 33 int sum=0; 34 for(int j=0;j<m;j++){ 35 if(x&(1<<j)){//x的第j+1列为1 36 sum=sum*2+s[i][j]-'A'; 37 } 38 } 39 ret+=i-num[sum];//前面和第i行不一样的 40 num[sum]++; 41 } 42 if(ret>=k){ 43 ans++; 44 } 45 } 46 printf("Case #%d: %d\n",i,ans); 47 } 48 return 0; 49 }