作者:
炽热的
,
2022-09-10 20:46:15
,
所有人可见
,
阅读 58
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long i64;
const int N = 110;
int n, m, q;
char s[15];
int w[N], cnt[1 << 12];
int ans[1 << 12][N];
int main()
{
scanf("%d%d%d", &n, &m, &q);
for (int i = 0; i < n; i ++ ) scanf("%d", &w[i]);
while (m -- )
{
scanf("%s", s);
int k = 0;
for (int i = 0; i < n; i ++ )
if (s[i] == '1') k += 1 << i;
cnt[k] ++ ;
}
for (int i = 0; i < 1 << n; i ++ )
for (int j = 0; j < 1 << n; j ++ )
{
int t = 0;
for (int k = 0; k < n; k ++ )
if ((i >> k & 1) == (j >> k & 1))
t += w[k];
if (t <= 100) ans[i][t] += cnt[j];
}
for (int i = 0; i < 1 << n; i ++ )
for (int j = 1; j <= 100; j ++ )
ans[i][j] += ans[i][j - 1];
while (q -- )
{
int k;
scanf("%s%d", s, &k);
int p = 0;
for (int i = 0; i < n; i ++ )
if (s[i] == '1') p += 1 << i;
printf("%d\n", ans[p][k]);
}
return 0;
}